diff --git a/CLAUDE.md b/CLAUDE.md index 35cf6ba..d5bc31a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -62,10 +62,11 @@ receives the output files — e.g. `work/test1/`, `work/test2/`, or any new fold the same layout: - `tische.ini` — table definitions: id, `Nummer`, `Hof` (venue/court), `Plaetze` (seats), `Nachbarliste` (neighbor table ids), `Koordinaten`. -- `bestellung.xml` — the guest order: `` blocks containing `` (with - `Vorname`/`Nachname`/optional `Titel`) and an `` (reservation count per person - template — this expands into that many identical bookings), plus optional `` to - pin a VIP group to a specific table. +- `bestellung.json` — the guest order: `{ "gruppen": [ ... ] }`, each group holding a + `"personen"` list (each with `vorname`/`nachname`/optional `titel`), an optional + `"anzahl"` (reservation count — expands every person in the group into that many identical + bookings), an optional `"name"` (display label), and an optional `"tisch"` to pin a VIP + group to a specific table. Replaces the old `bestellung.xml`/`XMLConfig`. - Output (written back into the same `--indir` directory): `TischePersonen.txt` (table → seated people) and `PersonenTische.csv` (person → table, sorted). @@ -78,7 +79,7 @@ GA cycle/penalty config: tables (by group size and number of splits), cost of a lone person, and per-table under-utilization penalties. -`tische.ini`/`bestellung.xml`/`TischePersonen.txt`/`PersonenTische.csv` are fixed filenames +`tische.ini`/`bestellung.json`/`TischePersonen.txt`/`PersonenTische.csv` are fixed filenames resolved as `os.path.join(indir, ...)` in `platz.py` — they are no longer configured in `platz.cfg`. @@ -130,10 +131,12 @@ Domain-agnostic and reusable in principle: touching, people as colored circles (color = group, via `SVGGruppenFarben`) placed evenly around the inside of their table's circle. The table-to-table grid spacing is derived from the largest table radius so tables never overlap regardless of their `Koordinaten`. -- `XMLConfig` — parses `bestellung.xml` into `Personen`/`Gruppen`/VIP-group/VIP-seat-map, - expanding each `` template by its sibling `` into that many individual - bookings, and treating any `` containing a `` tag as a VIP group pinned to - that table rather than going through normal GA placement. +- `JSONConfig` — parses `bestellung.json` into + `Personen`/`Gruppen`/VIP-group/VIP-seat-map/group-names, expanding each person by the + group's `"anzahl"` into that many individual bookings, and treating any group with a + `"tisch"` key as a VIP group pinned to that table rather than going through normal GA + placement. Returns a 5th element (`GruppenNamen`, `{Gid: display name}`) that the older + `XMLConfig` did not; `CSVConfig` (the web CSV adapter) returns the same 5-tuple. ### Data flow through `platz.py` (`__main__`) 1. Parse `--indir` (required) from the command line via `optparse`. @@ -141,7 +144,8 @@ Domain-agnostic and reusable in principle: `os.path.expandvars`). 3. Load `Zyklus` (GA schedule), `Strafliste` (penalties), `Tische` (table layout, from `/tische.ini`). -4. Load `/bestellung.xml` via `XMLConfig` → people, groups, VIP group, VIP seat map. +4. Load `/bestellung.json` via `JSONConfig` → people, groups, VIP group, VIP seat + map, group names. 5. Build a `Farm(Zyklus, Sitzplatzverteilung, Tische=..., Gruppen=..., Strafen=..., VIPListe=..., VIPs=...)`, which runs the whole GA cycle in its constructor. 6. Take `Farm.Bester()` and call `.speichern(...)` to write `/TischePersonen.txt` and diff --git a/README.md b/README.md index a878695..260fb30 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,10 @@ platz/ ``` - `libs/platz.py` — entry point; wires together config, input data, and the GA run. -- `libs/ga.py` — generic genetic-algorithm scaffolding (`Loesung`, `Zyklus`, `Farm`). +- `libs/ga.py` — generic genetic-algorithm scaffolding (`Loesung`, `Zyklus`, `Farm`, + `Entwicklung`). - `libs/Strukturdaten.py` — domain model for the seating problem (`Person`, `Gruppe`, - `Tisch`, `Strafliste`, `Sitzplatzverteilung`, `XMLConfig`). + `Tisch`, `Strafliste`, `Sitzplatzverteilung`, `JSONConfig`). ## Running the tests @@ -89,13 +90,13 @@ receiving the output files for one run — e.g. `work/test1/` or `work/test2/`: - `tische.ini` — one section per table: `Nummer`, `Hof` (venue/court), `Plaetze` (seat count), `Nachbarliste` (neighboring table ids), `Koordinaten`. -- `bestellung.xml` — `` blocks, each with a `` template - (`Vorname`/`Nachname`/optional `Titel`) and an `` (how many bookings to expand - that template into). A `` containing a `` tag is treated as a VIP group - pinned to that table instead of being placed by the GA. +- `bestellung.json` — `{ "gruppen": [ ... ] }`, each group with a `"personen"` list + (`vorname`/`nachname`/optional `titel`), an optional `"anzahl"` (how many bookings to + expand each person into), an optional `"name"` (display label) and an optional `"tisch"` + (pins the group as a VIP group to that table instead of placing it via the GA). To run against a different dataset, create a new folder with a `tische.ini` and -`bestellung.xml` following the same layout and pass it via `--indir`. +`bestellung.json` following the same layout and pass it via `--indir`. `cfg/platz.cfg` still selects the GA cycle/penalty config (independent of `--indir`): diff --git a/bin/run_web.bat b/bin/run_web.bat index d05362d..b538053 100644 --- a/bin/run_web.bat +++ b/bin/run_web.bat @@ -3,74 +3,25 @@ REM ================================================================ REM Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1) REM REM run_web.bat start - startet den Server im Hintergrund -REM run_web.bat stop - beendet den Server (inkl. Reload-Kindprozesse) +REM run_web.bat stop - beendet den Server REM run_web.bat status - zeigt ob und unter welcher PID er laeuft -REM run_web.bat - startet im Vordergrund (Strg+C zum Beenden) +REM run_web.bat - startet im Vordergrund mit Auto-Reload +REM (Strg+C zum Beenden) REM REM http://localhost:8000 Testoberflaeche REM http://localhost:8000/docs interaktive API-Doku (Swagger) REM -REM Die Prozess-/Portlogik liegt in run_web_helper.ps1 (cmd-Escaping -REM von mehrzeiligen PowerShell-Kommandos ist zu fehleranfaellig). +REM Die eigentliche Prozessverwaltung liegt plattformunabhaengig in +REM libs/webserver.py (laeuft unverandert auch unter Linux). REM ================================================================ call "%~dp0setenv.bat" > nul -set WEB_PORT=8000 -set HELFER=powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0run_web_helper.ps1" - -if /I "%~1"=="start" goto :start -if /I "%~1"=="stop" goto :stop -if /I "%~1"=="status" goto :status -if "%~1"=="" goto :vordergrund -echo Unbekannter Parameter "%~1" - erlaubt: start ^| stop ^| status -exit /b 1 - -REM ---------------------------------------------------------------- -:vordergrund -call :venv_pruefen || exit /b 1 -echo Starte Web-Testinstanz im Vordergrund (Strg+C zum Beenden) ... -python -m uvicorn main:app --reload --app-dir "%PLATZ%\web" --port %WEB_PORT% -exit /b %errorlevel% - -REM ---------------------------------------------------------------- -:start -call :venv_pruefen || exit /b 1 -%HELFER% check %WEB_PORT% -if not errorlevel 1 ( - echo Server laeuft bereits auf Port %WEB_PORT% - erst "run_web.bat stop". +if not exist "%PLATZ%\.venv\Scripts\activate.bat" ( + echo FEHLER: kein .venv gefunden - bitte zuerst bin\install_py.bat ausfuehren exit /b 1 ) -if not exist "%PLATZ%\log" mkdir "%PLATZ%\log" -echo Starte Web-Testinstanz im Hintergrund ... -start "platz-web" /MIN cmd /c "call "%~dp0setenv.bat" > nul && call "%PLATZ%\.venv\Scripts\activate.bat" && python -m uvicorn main:app --reload --app-dir "%PLATZ%\web" --port %WEB_PORT% > "%PLATZ%\log\run_web.log" 2>&1" -REM kurz warten und pruefen, ob der Server wirklich hochkommt -REM (ping statt timeout: funktioniert auch ohne interaktive Konsole) -ping -n 4 127.0.0.1 > nul -%HELFER% check %WEB_PORT% -if errorlevel 1 ( - echo FEHLER: Server ist nicht gestartet - siehe %PLATZ%\log\run_web.log - exit /b 1 -) -echo Server laeuft: http://localhost:%WEB_PORT% ^(Logdatei: log\run_web.log^) -exit /b 0 +call "%PLATZ%\.venv\Scripts\activate.bat" -REM ---------------------------------------------------------------- -:stop -echo Beende alle uvicorn-Prozesse dieses Projekts auf Port %WEB_PORT% ... -%HELFER% stop %WEB_PORT% -exit /b 0 - -REM ---------------------------------------------------------------- -:status -%HELFER% status %WEB_PORT% +python "%PLATZ_LIBS%\webserver.py" %* exit /b %errorlevel% - -REM ---------------------------------------------------------------- -:venv_pruefen -if exist "%PLATZ%\.venv\Scripts\activate.bat" ( - call "%PLATZ%\.venv\Scripts\activate.bat" - exit /b 0 -) -echo FEHLER: kein .venv gefunden - bitte zuerst bin\install_py.bat ausfuehren -exit /b 1 diff --git a/bin/run_web.sh b/bin/run_web.sh index 3ef2f03..cd31a23 100644 --- a/bin/run_web.sh +++ b/bin/run_web.sh @@ -3,93 +3,24 @@ # Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1) # # run_web.sh start - startet den Server im Hintergrund -# run_web.sh stop - beendet den Server (inkl. Reload-Kindprozesse) +# run_web.sh stop - beendet den Server # run_web.sh status - zeigt ob und unter welcher PID er laeuft -# run_web.sh - startet im Vordergrund (Strg+C zum Beenden) +# run_web.sh - startet im Vordergrund mit Auto-Reload +# (Strg+C zum Beenden) # # http://localhost:8000 Testoberflaeche # http://localhost:8000/docs interaktive API-Doku (Swagger) +# +# Die eigentliche Prozessverwaltung liegt plattformunabhaengig in +# libs/webserver.py (laeuft unveraendert auch unter Windows). # ================================================================ source "$(dirname "${BASH_SOURCE[0]}")/setenv.sh" > /dev/null -WEB_PORT=8000 -PIDDATEI="$PLATZ/log/run_web.pid" -LOGDATEI="$PLATZ/log/run_web.log" +if [ ! -f "$PLATZ/.venv/bin/activate" ]; then + echo "FEHLER: kein .venv gefunden - bitte zuerst bin/install_py.sh ausfuehren" + exit 1 +fi +source "$PLATZ/.venv/bin/activate" -venv_pruefen() { - if [ -f "$PLATZ/.venv/bin/activate" ]; then - source "$PLATZ/.venv/bin/activate" - else - echo "FEHLER: kein .venv gefunden - bitte zuerst bin/install_py.sh ausfuehren" - return 1 - fi -} - -lauft_pid() { - # gibt die PID des Servers aus, wenn er laeuft (Rueckgabe 0), sonst 1 - if [ -f "$PIDDATEI" ]; then - local pid - pid=$(cat "$PIDDATEI") - if kill -0 "$pid" 2> /dev/null; then - echo "$pid" - return 0 - fi - rm -f "$PIDDATEI" - fi - # Fallback: nach dem Prozess suchen (z.B. PID-Datei verloren) - pgrep -f "uvicorn main:app.*--port $WEB_PORT" | head -1 && return 0 - return 1 -} - -case "${1:-}" in - start) - venv_pruefen || exit 1 - if pid=$(lauft_pid); then - echo "Server laeuft bereits (PID $pid) - erst 'run_web.sh stop'." - exit 1 - fi - mkdir -p "$PLATZ/log" - echo "Starte Web-Testinstanz im Hintergrund ..." - nohup python -m uvicorn main:app --reload \ - --app-dir "$PLATZ/web" --port "$WEB_PORT" \ - > "$LOGDATEI" 2>&1 & - echo $! > "$PIDDATEI" - sleep 3 - if pid=$(lauft_pid); then - echo "Server laeuft: http://localhost:$WEB_PORT (PID $pid, Log: log/run_web.log)" - else - echo "FEHLER: Server ist nicht gestartet - siehe $LOGDATEI" - exit 1 - fi - ;; - stop) - gestoppt=0 - if pid=$(lauft_pid); then - # ganze Prozessgruppe beenden (uvicorn-Reloader + Kindprozesse) - pkill -TERM -P "$pid" 2> /dev/null && gestoppt=1 - kill "$pid" 2> /dev/null && gestoppt=1 - fi - # Nachzuegler, deren Elternprozess schon weg ist - pkill -f "uvicorn main:app.*--port $WEB_PORT" 2> /dev/null && gestoppt=1 - rm -f "$PIDDATEI" - if [ "$gestoppt" = "1" ]; then echo "Beendet."; else echo "Es lief nichts."; fi - ;; - status) - if pid=$(lauft_pid); then - echo "LAEUFT: http://localhost:$WEB_PORT (PID $pid)" - else - echo "GESTOPPT: kein Server auf Port $WEB_PORT" - fi - ;; - "") - venv_pruefen || exit 1 - echo "Starte Web-Testinstanz im Vordergrund (Strg+C zum Beenden) ..." - exec python -m uvicorn main:app --reload \ - --app-dir "$PLATZ/web" --port "$WEB_PORT" - ;; - *) - echo "Unbekannter Parameter '$1' - erlaubt: start | stop | status" - exit 1 - ;; -esac +exec python "$PLATZ_LIBS/webserver.py" "$@" diff --git a/bin/run_web_helper.ps1 b/bin/run_web_helper.ps1 deleted file mode 100644 index f66bb77..0000000 --- a/bin/run_web_helper.ps1 +++ /dev/null @@ -1,86 +0,0 @@ -# ================================================================ -# PowerShell-Helfer fuer run_web.bat (start/stop/status) -# Aufruf: powershell -NoProfile -ExecutionPolicy Bypass -# -File run_web_helper.ps1 -# -# "check" liefert nur den Exitcode (0 = Server lauscht, 1 = nicht) -# und keine Ausgabe - fuer die Pruefung nach dem Start. -# -# Verwaiste Socket-Eintraege (Listener, deren Prozess nicht mehr -# existiert - passiert nach abgestuerzten Reload-Kindprozessen) -# werden ueberall ignoriert. -# ================================================================ -param( - [Parameter(Mandatory = $true)][ValidateSet('status', 'stop', 'check')] - [string]$Aktion, - [int]$Port = 8000 -) - -function Lebende-Listener([int]$p) { - try { - Get-NetTCPConnection -LocalPort $p -State Listen -ErrorAction Stop | - Where-Object { Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue } - } catch { @() } -} - -function Uvicorn-Prozesse { - Get-CimInstance Win32_Process -Filter "Name like 'python%'" | - Where-Object { $_.CommandLine -match 'uvicorn main:app' } -} - -switch ($Aktion) { - - 'check' { - if (Lebende-Listener $Port) { exit 0 } else { exit 1 } - } - - 'status' { - $l = Lebende-Listener $Port | Select-Object -First 1 - if ($l) { - "LAEUFT: http://localhost:$Port (Listener-PID $($l.OwningProcess))" - foreach ($e in Uvicorn-Prozesse) { " uvicorn-Prozess: PID $($e.ProcessId)" } - exit 0 - } else { - "GESTOPPT: kein Server auf Port $Port" - exit 1 - } - } - - 'stop' { - $gefunden = $false - $alle = Get-CimInstance Win32_Process -Filter "Name like 'python%'" - $reloaderPids = @() - foreach ($e in ($alle | Where-Object { $_.CommandLine -match 'uvicorn main:app' })) { - $gefunden = $true - $reloaderPids += $e.ProcessId - # erst die Kindprozesse (Reload-Worker), dann den Reloader selbst - $alle | Where-Object { $_.ParentProcessId -eq $e.ProcessId } | ForEach-Object { - Stop-Process -Id $_.ProcessId -Force -Confirm:$false -ErrorAction SilentlyContinue - } - Stop-Process -Id $e.ProcessId -Force -Confirm:$false -ErrorAction SilentlyContinue - } - # Zombie-Jagd: uvicorn-Reload-Worker sind multiprocessing-Spawn-Kinder - # ("spawn_main(parent_pid=N, ...)"). Stirbt ihr Reloader unsanft, - # ueberleben sie MIT geerbtem Server-Socket und bedienen den Port - # unsichtbar weiter (weder "uvicorn" in der Kommandozeile noch - # Eintrag als Socket-Besitzer!). Erkennung: spawn_main-Prozess, - # dessen parent_pid tot oder ein eben beendeter Reloader ist. - foreach ($k in ($alle | Where-Object { $_.CommandLine -match 'multiprocessing.spawn.*spawn_main' })) { - if ($k.CommandLine -match 'parent_pid=(\d+)') { - $eltern = [int]$Matches[1] - $elternTot = -not (Get-Process -Id $eltern -ErrorAction SilentlyContinue) - if ($elternTot -or ($reloaderPids -contains $eltern)) { - $gefunden = $true - Stop-Process -Id $k.ProcessId -Force -Confirm:$false -ErrorAction SilentlyContinue - } - } - } - # Nachzuegler: alles Lebende, das den Port noch haelt - Lebende-Listener $Port | ForEach-Object { - $gefunden = $true - Stop-Process -Id $_.OwningProcess -Force -Confirm:$false -ErrorAction SilentlyContinue - } - if ($gefunden) { 'Beendet.' } else { 'Es lief nichts.' } - exit 0 - } -} diff --git a/doc/dateiformate.md b/doc/dateiformate.md index 492765e..cacf332 100644 --- a/doc/dateiformate.md +++ b/doc/dateiformate.md @@ -4,7 +4,7 @@ Referenz fuer die Eingabe- und Ausgabedateien eines `platz`-Laufs, mit Beispiele `work/test1/` und `work/test2/`. Alle vier Dateien liegen unter dem mit `--indir ` angegebenen Verzeichnis (z.B. -`work/test1/` oder `work/test2/`) unter festen Namen: `tische.ini`, `bestellung.xml` als +`work/test1/` oder `work/test2/`) unter festen Namen: `tische.ini`, `bestellung.json` als Eingabe, `TischePersonen.txt` und `PersonenTische.csv` als Ausgabe. Beispielaufruf: ```bash @@ -67,108 +67,90 @@ Werte wie `Nachbarliste` und `Koordinaten` werden mit `eval()` geladen (siehe `Tische.laden()` in `libs/Strukturdaten.py`) — es steht also echter Python-Ausdruckscode im File, keine reine INI-Syntax. -## Gaesteliste: `bestellung.xml` +## Gaesteliste: `bestellung.json` -Ein `` mit mehreren ``-Bloecken. Jede Gruppe enthaelt: +Ein JSON-Objekt mit dem Schluessel `"gruppen"`, einer Liste von Gruppen-Objekten. Jede +Gruppe enthaelt: -- ein oder mehrere ``-Elemente mit ``, `` und optionalem - `` -- optional `N`, um die zuletzt beschriebene Person zu einer Sammelbuchung - von `N` (anonymen/gleichnamigen) Personen zu vervielfaeltigen -- optional `Id`, um die Gruppe als VIP-Gruppe fest an den angegebenen Tisch - zu binden (sie wird dann **nicht** vom GA platziert) +- `"personen"`: Liste von Personen-Objekten mit `"vorname"`, `"nachname"` und optionalem + `"titel"` (Pflicht: Vor- und Nachname) +- optional `"name"`: Anzeigename der Gruppe (z.B. `"Familie Huber"`); nur fuer Ausgabe und + Web-Anzeige, nicht fuer die Optimierung relevant +- optional `"anzahl"`: N, um **jede** Person der Gruppe zu einer Sammelbuchung von N + (gleichnamigen) Buchungen zu vervielfaeltigen — praktisch fuer anonyme Kontingente +- optional `"tisch"`: Tisch-Id, um die Gruppe als VIP-Gruppe fest an diesen Tisch zu binden + (sie wird dann **nicht** vom GA platziert) -XML-Kommentare (``) sind erlaubt und werden beim Parsen ignoriert. +Geladen wird das File von `JSONConfig` in `libs/Strukturdaten.py` (Nachfolger des frueheren +`XMLConfig`; das alte `bestellung.xml`-Format wurde vollstaendig durch JSON abgeloest). +Die Datei sollte UTF-8 sein; ein evtl. vorhandenes BOM (Excel) wird geschluckt. -Minimalbeispiel mit Sammelbuchungen, aus `work/test1/bestellung.xml`: +Minimalbeispiel mit Sammelbuchungen, aus `work/test1/bestellung.json`: -```xml - - - - - A - AA - Dipl. Ing. - - 10 - - - - - B - BB - Prof. - - 4 - - - - - C - CC - Dr. - - 5 - - - +```json +{ + "gruppen": [ + { + "anzahl": 10, + "personen": [ + { "vorname": "A", "nachname": "AA", "titel": "Dipl. Ing." } + ] + }, + { + "anzahl": 4, + "personen": [ + { "vorname": "B", "nachname": "BB", "titel": "Prof." } + ] + }, + { + "anzahl": 5, + "personen": [ + { "vorname": "C", "nachname": "CC", "titel": "Dr." } + ] + } + ] +} ``` -Umfangreicheres Beispiel mit benannten Personen und einer VIP-Gruppe, aus -`work/test2/bestellung.xml`: +Umfangreicheres Beispiel mit benannten Gruppen und einer VIP-Gruppe, aus +`work/test2/bestellung.json`: -```xml - - - - - - Michael - Stangl - Dipl. Ing. - - - Magnus - Mueller - Professor - - - Bernd Robert - Hoehn - Professor - - 1 - - - - - - Heinz - Bruegge - - - Hubert - K - - - - - - - Bestelli - Bloedkopf - - 3 - - - +```json +{ + "gruppen": [ + { + "name": "einfache Gruppe aus drei Personen mit festem Wunsch fuer einen Tisch", + "tisch": 1, + "personen": [ + { "vorname": "Michael", "nachname": "Stangl", "titel": "Dipl. Ing." }, + { "vorname": "Magnus", "nachname": "Mueller", "titel": "Professor" }, + { "vorname": "Bernd Robert", "nachname": "Hoehn", "titel": "Professor" } + ] + }, + { + "name": "einfache Gruppe aus zwei Personen", + "personen": [ + { "vorname": "Heinz", "nachname": "Bruegge" }, + { "vorname": "Hubert", "nachname": "K" } + ] + }, + { + "name": "Gruppe aus drei anonymen Personen", + "anzahl": 3, + "personen": [ + { "vorname": "Bestelli", "nachname": "Bloedkopf" } + ] + } + ] +} ``` -Die erste Gruppe hier ist per `1` fest an Tisch 1 gebunden (VIP-Gruppe); die -letzte Gruppe erzeugt ueber `3` drei gleichnamige "Bestelli Bloedkopf" -Buchungen. +Die erste Gruppe hier ist per `"tisch": 1` fest an Tisch 1 gebunden (VIP-Gruppe); die letzte +Gruppe erzeugt ueber `"anzahl": 3` drei gleichnamige "Bestelli Bloedkopf" Buchungen. + +> Fuer den Web-Weg (Meilenstein 1) gibt es zusaetzlich einen CSV-Import (`libs/CSVConfig.py`, +> Spalten `Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl`) — inhaltlich aequivalent, nur +> flach statt verschachtelt. ## Ausgabe: `TischePersonen.txt` diff --git a/doc/images/drei_tische_kette_paare.svg b/doc/images/drei_tische_kette_paare.svg index 8cfcd0c..4b3a405 100644 --- a/doc/images/drei_tische_kette_paare.svg +++ b/doc/images/drei_tische_kette_paare.svg @@ -2,15 +2,18 @@ -Tisch 1 + +0 -Tisch 2 + +0 -Tisch 3 + +0 diff --git a/doc/images/sechs_tische_kreis_dreiergruppen.svg b/doc/images/sechs_tische_kreis_dreiergruppen.svg index 6fafc60..22f3dfc 100644 --- a/doc/images/sechs_tische_kreis_dreiergruppen.svg +++ b/doc/images/sechs_tische_kreis_dreiergruppen.svg @@ -2,27 +2,33 @@ -Tisch 1 + +0 -Tisch 2 + +0 -Tisch 3 + +0 -Tisch 4 - - + + + +0 -Tisch 5 + +0 -Tisch 6 + +0 diff --git a/doc/images/test_entwicklung.svg b/doc/images/test_entwicklung.svg new file mode 100644 index 0000000..aa085f8 --- /dev/null +++ b/doc/images/test_entwicklung.svg @@ -0,0 +1,33 @@ + + + +Entwicklung der Loesungsfindung + + + +-200 + +-168 + +-136 + +-104 + +-72 + +-40 +Wertigkeit (hoeher = besser) +Zyklus-Aktion (Zeit) +e +s +m + + + + +beste Loesung + +Durchschnitt + +schlechteste Loesung + diff --git a/doc/images/vier_tische_linie_viergruppen.svg b/doc/images/vier_tische_linie_viergruppen.svg index 1163233..4dea3f6 100644 --- a/doc/images/vier_tische_linie_viergruppen.svg +++ b/doc/images/vier_tische_linie_viergruppen.svg @@ -2,19 +2,23 @@ -Tisch 1 + +0 -Tisch 2 + +0 -Tisch 3 + +0 -Tisch 4 + +0 diff --git a/doc/roadmap.md b/doc/roadmap.md index eaf96e7..f5c6c59 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -235,6 +235,17 @@ verarbeitet werden (was bei jedem Webserver der Fall ist). - [ ] Optional: Hintergrund-Job-Queue (z.B. Celery/RQ), falls Berechnung >5s dauert, damit der Webserver nicht blockiert +**Tech-Debt / Modernisierung (Code-Review 2026-07-11):** Beim Umbau bereits erledigt sind +`eval()` → `ast.literal_eval` (bzw. ein sicherer Mini-Auswerter für die String-Ausdrücke +in `zyklus.cfg`) und `defaultdict(set)` in `Plaetze`. Bewusst *nicht* umgesetzt, für M2 zu +prüfen: **GA-Kern auf [DEAP](https://deap.readthedocs.io/) umstellen** (fertige +Population/Selektion/Statistik — würde das eigene `Farm`/`Entwicklung`-Gerüst ablösen und +`TopN` sowie die Diversitäts-Seeds quasi geschenkt liefern); **SVG-Erzeugung** in +`Sitzplatzverteilung.alsSVG`/`Entwicklung.alsSVG` von String-Konkatenation auf `svgwrite` +oder Jinja2-Templates; **Container-/Datenklassen** (`Person`, `Gruppe`, …) als +`@dataclass`. `Sitzplatzverteilung.TopX` bleibt bewusst handgeschrieben (die monoton +sinkende Schwelle prägt das Mutationsverhalten, siehe Kommentar im Code). + **Aufwand:** ~3–4 Wochen, aufbauend auf Meilenstein 1. --- diff --git a/libs/CSVConfig.py b/libs/CSVConfig.py index 7b9307e..a9e3978 100644 --- a/libs/CSVConfig.py +++ b/libs/CSVConfig.py @@ -1,6 +1,6 @@ """ -Liest eine Gaesteliste im CSV-Format ein — der Web-Ersatz fuer bestellung.xml -(Meilenstein 1 der Roadmap, Adapter analog zu XMLConfig in Strukturdaten.py). +Liest eine Gaesteliste im CSV-Format ein — der Web-Ersatz fuer bestellung.json +(Meilenstein 1 der Roadmap, Adapter analog zu JSONConfig in Strukturdaten.py). CSV-Format (Kopfzeile noetig, Spaltenreihenfolge egal, Trennzeichen ; oder ,): @@ -12,10 +12,10 @@ CSV-Format (Kopfzeile noetig, Spaltenreihenfolge egal, Trennzeichen ; oder ,): zusammen und sollen moeglichst zusammen sitzen. Leer = Einzelperson (bildet eine eigene Ein-Personen-Gruppe). - Tisch: optionale Tischnummer — die Person ist VIP und wird fest an - diesen Tisch gesetzt (wie in bestellung.xml). + diesen Tisch gesetzt (wie "tisch" in bestellung.json). VIPs laufen nicht durch die GA-Platzierung. - Anzahl: optionale Reservierungsanzahl — expandiert die Zeile in so - viele identische Buchungen (wie in bestellung.xml, + viele identische Buchungen (wie "anzahl" in bestellung.json, z.B. fuer anonyme Sammelbuchungen). Leer = 1. Zusaetzlich werden die Spalten "MagNicht" und "MagGern" akzeptiert, @@ -35,7 +35,7 @@ from Strukturdaten import Person, Personen, Gruppe, Gruppen class CSVConfig: - """aus CSV Text/Datei alles einlesen (Rueckgabe wie XMLConfig.laden, + """aus CSV Text/Datei alles einlesen (Rueckgabe wie JSONConfig.laden, plus Gruppennamen fuer die Anzeige im Web-Frontend)""" PflichtSpalten = ['vorname', 'nachname'] @@ -46,11 +46,11 @@ class CSVConfig: """parst den CSV-Text und baut Personen/Gruppen/VIPs auf Rueckgabe: [ PN, GN, VIPGruppe, VipHash, GruppenNamen ] - - PN: Personen-Container (ohne VIPs, wie XMLConfig) - - GN: Gruppen-Container (ohne VIP-Gruppe, wie XMLConfig) + - PN: Personen-Container (ohne VIPs, wie JSONConfig) + - GN: Gruppen-Container (ohne VIP-Gruppe, wie JSONConfig) - VIPGruppe: Gruppe(0) mit allen fest gesetzten Personen - VipHash: { PersonId: Tischnummer } fuer VIPsSetzen() - - GruppenNamen: { GruppenId: Anzeigename } (neu gegenueber XMLConfig) + - GruppenNamen: { GruppenId: Anzeigename } """ # Trennzeichen automatisch bestimmen: die Kopfzeile entscheidet Kopfzeile = Text.lstrip('').splitlines()[0] if Text.strip() else '' diff --git a/libs/Strukturdaten.py b/libs/Strukturdaten.py index 0e8f29f..8f82206 100755 --- a/libs/Strukturdaten.py +++ b/libs/Strukturdaten.py @@ -11,11 +11,12 @@ __license__ = "Python" from itertools import chain from random import * +import ast import configparser, os import copy import math +from collections import defaultdict from functools import total_ordering -from xml.dom import minidom # Strukturklassen: Person, Gruppe, Tisch @@ -256,12 +257,15 @@ class Tische: config.read( os.path.expanduser(FileName) ) for section in config.sections(): Tid = int(section) - Nummer = eval(config.get( section, 'Nummer' )) - nPl = eval(config.get( section, 'Plaetze' )) - Koords = eval(config.get( section, 'Koordinaten' )) - Nachbarn = eval(config.get( section, 'Nachbarliste' )) - Hofid = eval(config.get( section, 'Hof' )) - T = Tisch( Tid, Plaetze=nPl, Koordinaten=Koords, Nachbarliste=Nachbarn, Hof=Hofid, Nummer=Nummer ) + # ast.literal_eval statt eval: tische.ini kann eine hochgeladene + # Fremddatei sein (Web-M1), da darf kein beliebiger Code laufen. + # Erlaubt weiterhin Zahlen, Tupel und Listen wie zuvor. + Nummer = ast.literal_eval(config.get( section, 'Nummer' )) + nPl = ast.literal_eval(config.get( section, 'Plaetze' )) + Koords = ast.literal_eval(config.get( section, 'Koordinaten' )) + Nachbarn = ast.literal_eval(config.get( section, 'Nachbarliste' )) + Hofid = ast.literal_eval(config.get( section, 'Hof' )) + T = Tisch( Tid, Plaetze=nPl, Koordinaten=Koords, Nachbarliste=Nachbarn, Hof=Hofid, Nummer=Nummer ) self.Tisch_dazu( T ) def vonId(self, SearchedId): for T in chain(self.TischListe): @@ -281,19 +285,21 @@ class Tische: class Plaetze: """Informationen ueber freie oder benachbarte Plaetze""" def __init__(self, Tische): - # mache Listen mit den Tischen mit n Freien Plaetzen - self.__TIDsNFreie = [] + # je Anzahl freier Plaetze ein Set von Tisch-Ids. defaultdict(set) + # erspart die manuelle Vorbelegung und liefert fuer noch nie + # gesehene Fuellstaende automatisch ein leeres Set. + self.__TIDsNFreie = defaultdict(set) self.__Groesster = Tische.Groesster self.__Tische = Tische - for i in range( self.__Groesster + 1 ): - self.__TIDsNFreie.append( set() ) for T in Tische.TischListe: n_freie = T.freiePlaetze() self.__TIDsNFreie[n_freie].add(T.Id) def __repr__(self): result = "\n-- Tische mit n Freien Plaetzen:\n" for i in range(self.__Groesster+1): - result = result + " " +repr(i) + " :" + repr(self.__TIDsNFreie[i]) + "\n" + # .get statt [i], damit das Anzeigen keine leeren Eintraege + # ins defaultdict schreibt + result = result + " " +repr(i) + " :" + repr(self.__TIDsNFreie.get(i, set())) + "\n" return result def IdsnFreie(self, n_freie): """gibt ein Set mit allen Tischids zurueck, wo noch X freie Plaetze sind""" @@ -406,11 +412,13 @@ class Strafliste: print("-- Strafliste laden") config = configparser.ConfigParser() config.read( os.path.expanduser(FileName) ) - self.NichtNachbar = eval(config.get( 'Globals', 'NichtNachbar' )) - self.Allein = eval(config.get( 'Globals', 'Allein' )) - self.TischWert = eval( config.get( 'Globals', 'TischWertigkeiten' ) ) + # ast.literal_eval statt eval: die Werte sind reine Literale + # (Zahlen und Dicts wie {2:-10}), also kein Code noetig. + self.NichtNachbar = ast.literal_eval(config.get( 'Globals', 'NichtNachbar' )) + self.Allein = ast.literal_eval(config.get( 'Globals', 'Allein' )) + self.TischWert = ast.literal_eval( config.get( 'Globals', 'TischWertigkeiten' ) ) for (k,v) in config.items( 'Trennung' ): - self.GruppenTrennen[int(k)] = eval(v) + self.GruppenTrennen[int(k)] = ast.literal_eval(v) # Sitzplatzverteilung, bestehend aus den Einzelelementen @@ -618,10 +626,6 @@ class Sitzplatzverteilung: Teile.append( '\n' % (Mx, My, TR) ) - Teile.append( - 'Tisch %s\n' - % (Mx, My - TR - 2, T.Id) ) Plaetze = list(T) n = len(Plaetze) @@ -636,6 +640,19 @@ class Sitzplatzverteilung: 'stroke="black" stroke-width="1"/>\n' % (Px, Py, PersonenRadius, Farbe) ) + # Tischnummer zentriert in die Tischmitte (nach den Personen- + # kreisen gezeichnet, damit sie oben liegt; ein halbtransparenter + # weisser Kreis darunter haelt sie auch ueber Personenkreisen + # lesbar, falls die Tischmitte belegt sein sollte) + Teile.append( + '\n' % (Mx, My, PersonenRadius) ) + Teile.append( + '%s\n' + % (Mx, My, PersonenRadius * 1.1, T.Nummer) ) + Teile.append( '\n' ) fout = open( OutputSVG, 'w' ) @@ -897,11 +914,19 @@ class Sitzplatzverteilung: Tisch = Tische.vonId(TischId) self.PersonSetzen( Person, Tisch ) def TopX(self, Liste, Anzahl=-1 ): - """gibt eine Liste mit X Ids zurueck, die die schlechtesten Wertungen haben""" + """gibt eine Liste mit X Ids zurueck, die die schlechtesten Wertungen haben + + Achtung: Dies ist bewusst *nicht* heapq.nsmallest. Der laufende + Schwellwert Min sinkt monoton mit, so dass nur Ids aufgenommen + werden, die waehrend der Iteration einen neuen Tiefpunkt erreichen + oder gleichziehen. Das Ergebnis haengt an der Iterationsreihenfolge + und praegt das Mutationsverhalten des GA (mutieren() -> + SchlechteGruppenTopX). Eine Umstellung auf heapq wuerde die + Loesungsfindung veraendern und ist daher bewusst unterlassen. + """ Min = 0 RListe=[] Wertigkeit=[] - # TODO filter verwenden for Id, Wert in Liste.items(): if Wert <= Min: RListe.append(Id) @@ -911,92 +936,112 @@ class Sitzplatzverteilung: # Sitzplatzverteilung, bestehend aus den Einzelelementen -class XMLConfig: - """aus Xml file alles einlesen""" - def getText(self, nodelist): - rc = "" - for node in nodelist: - if node.nodeType == node.TEXT_NODE: - rc = rc + node.data - return rc - def handlePersonNode( self, person ): - """Personendaten erfassen""" - info = {} - try: - Titel = person.getElementsByTagName("Titel")[0] - info["Titel"] = self.getText(Titel.childNodes) - except IndexError: - info["Titel"] = "" - Vorname = person.getElementsByTagName("Vorname")[0] - Nachname = person.getElementsByTagName("Nachname")[0] - info["Vorname"] = self.getText(Vorname.childNodes) - info["Nachname"] = self.getText(Nachname.childNodes) - return info - def HandleBestellung(self, Bestellung): - """alle Bloecke in der XML Bestellung parsen""" - PidListe = [] - VipHash = {} +class JSONConfig: + """liest die Gaesteliste aus einer bestellung.json ein + (Nachfolger des frueheren XMLConfig; JSON hat die alte XML-Form + abgeloest, siehe doc/dateiformate.md). + + Erwartete Struktur: + { + "gruppen": [ + { + "name": "Familie Huber", # optional, nur Anzeige + "tisch": 1, # optional -> VIP-Fixplatz + "anzahl": 1, # optional -> Sammelbuchung + "personen": [ + {"vorname": "Anna", "nachname": "Huber", "titel": ""} + ] + } + ] + } + + "tisch" macht die ganze Gruppe zu VIPs an diesem Tisch (laeuft + nicht durch die GA-Platzierung). "anzahl" > 1 vervielfacht jede + Person der Gruppe in so viele identische Buchungen (anonyme + Sammelbuchung). "titel" ist optional. + """ + def HandleBestellung(self, Daten): + """die geladene JSON-Struktur in Personen/Gruppen/VIPs zerlegen + + Rueckgabe: [ PN, GN, VIPGruppe, VipHash, GruppenNamen ] + (wie CSVConfig; das fruehere XMLConfig gab die ersten vier + Elemente zurueck - Aufrufer, die GruppenNamen nicht brauchen, + koennen es ignorieren.) + """ + if not isinstance( Daten, dict ) or 'gruppen' not in Daten: + raise ValueError("bestellung.json braucht ein Objekt mit dem " + "Schluessel 'gruppen'") PN = Personen() GN = Gruppen() VIPGruppe = Gruppe( 0 ) + VipHash = {} + GruppenNamen = {} - print('-HandleBestellung') - AlleGruppenXML = Bestellung.getElementsByTagName("Gruppe") PID = 0 GID = 0 - for GruppeXML in AlleGruppenXML: - GID = GID + 1 - print('-- GID ' + repr(GID)) - G = Gruppe( GID ) + for Index, GruppeJSON in enumerate( Daten['gruppen'] ): + if 'personen' not in GruppeJSON: + raise ValueError("Gruppe %d: 'personen' fehlt" % (Index + 1)) - IsVip = False - AnzahlReservierungen = 1 - for Node in GruppeXML.childNodes: - if Node.nodeName == 'Tisch': - TischNr = self.getText(Node.childNodes) - print('TischNr:', TischNr) - IsVip = True - if Node.nodeName == 'Anzahl': - AnzahlReservierungen = int(self.getText(Node.childNodes)) - print('Anzahl der Reservierungen:', AnzahlReservierungen) - IsContingent = True + IsVip = 'tisch' in GruppeJSON and GruppeJSON['tisch'] is not None + if IsVip: + try: + TischNr = int( GruppeJSON['tisch'] ) + except (TypeError, ValueError): + raise ValueError("Gruppe %d: 'tisch' ist keine " + "Tischnummer" % (Index + 1)) - for Node in GruppeXML.childNodes: - if Node.nodeName == 'Person': - NRes = 0 - for i in range(int(AnzahlReservierungen)): - NRes = NRes + 1 - PID = PID + 1 - print("PID =" + repr(PID)) - info = self.handlePersonNode( Node ) + try: + AnzahlReservierungen = int( GruppeJSON.get( 'anzahl', 1 ) ) + except (TypeError, ValueError): + raise ValueError("Gruppe %d: 'anzahl' ist keine Zahl" + % (Index + 1)) + if AnzahlReservierungen < 1: + raise ValueError("Gruppe %d: 'anzahl' muss >= 1 sein" + % (Index + 1)) + + # regulaere (nicht-VIP) Gruppen bekommen eine GID + if not IsVip: + GID = GID + 1 + G = Gruppe( GID ) + GruppenNamen[ GID ] = GruppeJSON.get( 'name', 'Gruppe %d' % GID ) + + for PersonJSON in GruppeJSON['personen']: + Vorname = str( PersonJSON.get( 'vorname', '' ) ).strip() + Nachname = str( PersonJSON.get( 'nachname', '' ) ).strip() + Titel = str( PersonJSON.get( 'titel', '' ) ).strip() + if Vorname == '' or Nachname == '': + raise ValueError("Gruppe %d: jede Person braucht Vorname " + "und Nachname" % (Index + 1)) + for i in range( AnzahlReservierungen ): + PID = PID + 1 + P = Person( PID, Vorname, Nachname, Titel ) + if IsVip: + VipHash[ PID ] = TischNr + VIPGruppe.Person_dazu( P ) + else: + PN.PersonAdd( P ) + G.Person_dazu( P ) + + if not IsVip: + if G.Anzahl() > 0: + GN.Gruppe_dazu( G ) + else: + # leere Gruppe wieder verwerfen + del GruppenNamen[ GID ] + GID = GID - 1 + + return [ PN, GN, VIPGruppe, VipHash, GruppenNamen ] - Vorname = info["Vorname"] - Nachname = info["Nachname"] - Titel = info["Titel"] - P = Person( PID, Vorname, Nachname, Titel) - if IsVip == True: - PidListe.append( int(PID) ) - VipHash[ int(PID) ] = int(TischNr) - VIPGruppe.Person_dazu( P ) - else: - PN.PersonAdd( P ) - G.Person_dazu( P ) - if (G.Anzahl() > 0) & (IsVip != True): - GN.Gruppe_dazu( G ) - if IsVip == True: - GID = GID - 1 - print(PN) - print(GN) - print(VIPGruppe) - print(VipHash) - print('==========') - return [ PN, GN, VIPGruppe, VipHash ] def laden(self, Bestellung): - """lese alle Eingangsdaten aus einem XML File ein""" - fsock = open( Bestellung, 'r') - xmlini = minidom.parse(fsock) - return self.HandleBestellung(xmlini) + """lese alle Eingangsdaten aus einer JSON-Datei ein""" + import json + # utf-8-sig schluckt ein evtl. vorhandenes BOM + fsock = open( Bestellung, 'r', encoding='utf-8-sig' ) + Daten = json.load( fsock ) + fsock.close() + return self.HandleBestellung( Daten ) diff --git a/libs/ga.py b/libs/ga.py index 630fb90..85a00e7 100755 --- a/libs/ga.py +++ b/libs/ga.py @@ -6,9 +6,37 @@ from random import * from itertools import chain from copy import deepcopy from functools import total_ordering +import ast import configparser, os +def _StringAusdruck(text): + """wertet einen einfachen String-Ausdruck sicher aus. + + zyklus.cfg nutzt kompakte Schreibweisen wie + 'e,'+'s,z,m,j,z,'*3+'s' + also String-Literale, mit '+' verkettet und mit '*' vervielfacht. + ast.literal_eval kann das nicht (nur reine Literale), eval() waere + unsicher. Dieser Mini-Auswerter erlaubt ausschliesslich str-Literale, + ganze Zahlen sowie die Operatoren + und * - kein Funktionsaufruf, + keine Namen, kein beliebiger Code. + """ + knoten = ast.parse(text, mode='eval').body + + def rechne(n): + if isinstance(n, ast.Constant) and isinstance(n.value, (str, int)): + return n.value + if isinstance(n, ast.BinOp) and isinstance(n.op, (ast.Add, ast.Mult)): + links, rechts = rechne(n.left), rechne(n.right) + return links + rechts if isinstance(n.op, ast.Add) else links * rechts + raise ValueError("unerlaubter Ausdruck in zyklus.cfg: %r" % text) + + ergebnis = rechne(knoten) + if not isinstance(ergebnis, str): + raise ValueError("zyklus.cfg-Ausdruck ergibt keinen String: %r" % text) + return ergebnis + + __author__ = "Michael Stangl" __version__ = "$Revision: $" __date__ = "$Date: $" @@ -65,24 +93,174 @@ class Zyklus: ZyklusPath= os.path.join( FileName ) config.read( ZyklusPath ) self.Name = ZyklusName - Abfolge = eval( config.get( ZyklusName, 'Abfolge' )) - Anzahl = eval( config.get( ZyklusName, 'Anzahl' )) + Abfolge = _StringAusdruck( config.get( ZyklusName, 'Abfolge' )) + Anzahl = _StringAusdruck( config.get( ZyklusName, 'Anzahl' )) self.Abfolge = Abfolge.split(',') self.Anzahl = Anzahl.split(',') pass +class Entwicklung: + """Beobachtungsobjekt: zeichnet den Verlauf der Loesungsfindung auf. + + Nach jeder Zyklus-Aktion wird ein Messpunkt erfasst (bester, + durchschnittlicher und schlechtester Wert im aktuellen Pool). + alsSVG() zeichnet daraus eine Verlaufsgrafik: Zeitachse (Aktions- + index) nach rechts, Wertigkeit auf der Y-Achse. Domaenen-agnostisch; + funktioniert mit jeder Loesung, die ein Attribut .value hat. + """ + # Buchstaben der Zyklus-Abfolge -> lesbare Namen fuer die Beschriftung + AktionsNamen = { + 'e': 'erzeugen', 'm': 'mutieren', 's': 'selektieren', + 'S': 'zufaellig', 'j': 'behalten', 'z': 'Generation' } + + def __init__(self): + # je Messpunkt: (Schrittindex, Aktion, bester, schnitt, schlechtester, N) + self.Punkte = [] + + def erfassen(self, Aktion, Pool): + """einen Messpunkt aus dem aktuellen Pool aufnehmen""" + if not Pool: + return + Werte = [ L.value for L in Pool ] + self.Punkte.append( ( + len(self.Punkte), + Aktion, + max(Werte), + sum(Werte) / len(Werte), + min(Werte), + len(Werte) ) ) + + def __repr__(self): + r = "-- Entwicklung (%d Messpunkte):\n" % len(self.Punkte) + for (i, Aktion, best, schnitt, schlecht, n) in self.Punkte: + r = r + (" %3d %-12s best=%s schnitt=%.1f schlecht=%s (N=%d)\n" + % (i, self.AktionsNamen.get(Aktion, Aktion), + best, schnitt, schlecht, n)) + return r + + def alsSVG(self, OutputSVG, Breite=900, Hoehe=500, Rand=60): + """zeichnet den aufgezeichneten Verlauf als SVG-Liniendiagramm""" + if not self.Punkte: + raise ValueError("keine Messpunkte aufgezeichnet") + + AlleWerte = [] + for (_i, _a, best, schnitt, schlecht, _n) in self.Punkte: + AlleWerte.extend( (best, schnitt, schlecht) ) + WMin, WMax = min(AlleWerte), max(AlleWerte) + if WMax == WMin: + WMax = WMin + 1 # flache Linie nicht auf den Rand kleben + + N = len(self.Punkte) + PlotBreite = Breite - 2 * Rand + PlotHoehe = Hoehe - 2 * Rand + + def X(i): + if N == 1: + return Rand + PlotBreite / 2 + return Rand + PlotBreite * i / (N - 1) + + def Y(wert): + # hoher (besserer) Wert oben, niedriger unten + return Rand + PlotHoehe * (WMax - wert) / (WMax - WMin) + + def Polyline(Index, Farbe, Beschriftung): + punkte = ' '.join( '%.1f,%.1f' % (X(i), Y(p[Index])) + for i, p in enumerate(self.Punkte) ) + return ('\n' % (punkte, Farbe), Beschriftung, Farbe) + + Teile = [] + Teile.append( '\n' ) + Teile.append( + '\n' + % (Breite, Hoehe, Breite, Hoehe) ) + Teile.append( '\n' ) + Teile.append( + 'Entwicklung der Loesungsfindung\n' + % (Breite // 2) ) + + # Achsen + Teile.append( + '\n' % (Rand, Rand, Rand, Hoehe - Rand) ) + Teile.append( + '\n' + % (Rand, Hoehe - Rand, Breite - Rand, Hoehe - Rand) ) + + # Y-Gitter + Beschriftung (5 Linien) + for k in range(6): + wert = WMin + (WMax - WMin) * k / 5 + y = Y(wert) + Teile.append( + '\n' % (Rand, y, Breite - Rand, y) ) + Teile.append( + '%.0f\n' % (Rand - 8, y + 4, wert) ) + Teile.append( + 'Wertigkeit ' + '(hoeher = besser)\n' % (Hoehe // 2, Hoehe // 2) ) + Teile.append( + 'Zyklus-Aktion (Zeit)\n' + % (Breite // 2, Hoehe - 18) ) + + # X-Beschriftung: Aktionsbuchstaben (bei wenigen Punkten alle, + # sonst ausgeduennt, damit die Achse lesbar bleibt) + Schritt = max(1, N // 30) + for i, p in enumerate(self.Punkte): + if i % Schritt == 0 or i == N - 1: + Teile.append( + '%s\n' % (X(i), Hoehe - Rand + 16, p[1]) ) + + # die drei Kurven + Kurven = [ + Polyline(2, '#2f6f4f', 'beste Loesung'), + Polyline(3, '#c08a2d', 'Durchschnitt'), + Polyline(4, '#a03030', 'schlechteste Loesung') ] + for (svg, _besch, _farbe) in Kurven: + Teile.append( svg ) + + # Legende oben rechts + LegX = Breite - Rand - 160 + LegY = Rand + 10 + for k, (_svg, besch, farbe) in enumerate(Kurven): + y = LegY + k * 18 + Teile.append( + '\n' % (LegX, y, LegX + 24, y, farbe) ) + Teile.append( + '%s\n' + % (LegX + 30, y + 4, besch) ) + + Teile.append( '\n' ) + + fout = open( OutputSVG, 'w' ) + fout.writelines( Teile ) + fout.close() + + class Farm: """enthaelt und pflegt Loesungsobjekte, kreuzt, mutiert, selektiert sie""" def __init__(self, Zyklus, Klasse, *Arguments, **keywords): """initialisiere die Farm - + mit einem definerten Zyklus fuer die Zucht und dem gewunschten zu Zuchtobjekt + + Beobachtung: self.Entwicklung zeichnet nach jeder Zyklus-Aktion + den Pool-Zustand auf und laesst sich per alsSVG() visualisieren. """ self.Position = 0 self.Pool = [] self.PoolNeu = [] self.Zyklus = Zyklus self.Klasse = Klasse + self.Entwicklung = Entwicklung() for Aktion, Zahl in zip(Zyklus.Abfolge,Zyklus.Anzahl): #print 'Aktion:',Aktion #print 'Zahl:',Zahl @@ -101,6 +279,11 @@ class Farm: self.NeueGeneration() else: pass + # nach jeder Aktion den aktuellen Pool-Zustand aufzeichnen. + # Der beobachtete Pool ist der, in dem gerade die Loesungen + # liegen: PoolNeu, sobald dort etwas gesammelt wurde, sonst Pool. + self.Entwicklung.erfassen( + Aktion, self.PoolNeu if self.PoolNeu else self.Pool ) def LoesungenErzeugen(self, N, Klasse, *Arguments, **keywords): """ Erzeuge Loesungen""" for i in range(N): diff --git a/libs/platz.py b/libs/platz.py index 3af39b3..05a6d1e 100755 --- a/libs/platz.py +++ b/libs/platz.py @@ -18,16 +18,21 @@ import optparse if __name__ == '__main__': # Kommandozeilenoption --indir: Verzeichnis mit den Eingabedateien - # (tische.ini, bestellung.xml) und Ziel fuer die Ausgabedateien + # (tische.ini, bestellung.json) und Ziel fuer die Ausgabedateien # (TischePersonen.txt, PersonenTische.csv) parser = optparse.OptionParser() parser.add_option( "--indir", dest="indir", default=None, - help="Verzeichnis mit tische.ini und bestellung.xml; " + help="Verzeichnis mit tische.ini und bestellung.json; " "dort werden auch TischePersonen.txt und PersonenTische.csv abgelegt" ) parser.add_option( "--tosvg", dest="tosvg", action="store_true", default=False, help="zusaetzlich eine Sitzplatzverteilung.svg im --indir Verzeichnis " "erzeugen (Tische als weisse Kreise, Personen als farbige " "Kreise je Gruppe)" ) + parser.add_option( "--show-development", dest="showdev", action="store_true", + default=False, + help="zusaetzlich eine Entwicklung.svg im --indir Verzeichnis " + "erzeugen: Verlauf der Loesungsfindung (Zeitachse nach rechts, " + "beste/durchschnittliche/schlechteste Wertigkeit auf der Y-Achse)" ) (options, args) = parser.parse_args() if options.indir is None: @@ -51,12 +56,13 @@ if __name__ == '__main__': # lade Eingabedateien Tischconfig = os.path.join( InDir, 'tische.ini' ) - Bestellung = os.path.join( InDir, 'bestellung.xml' ) + Bestellung = os.path.join( InDir, 'bestellung.json' ) # lade Ausgabedateien AusgabeTP= os.path.join( InDir, 'TischePersonen.txt' ) AusgabePT = os.path.join( InDir, 'PersonenTische.csv' ) AusgabeSVG = os.path.join( InDir, 'Sitzplatzverteilung.svg' ) + AusgabeEntwicklung = os.path.join( InDir, 'Entwicklung.svg' ) Z = Zyklus() Z.laden( Zyklusconfig, Zyklusart ) @@ -68,8 +74,8 @@ if __name__ == '__main__': TE.laden( Tischconfig ) print(TE) - InputFile = XMLConfig() - [ PN, GN, VIPGruppe, VIPListePT ] = InputFile.laden( Bestellung ) + InputFile = JSONConfig() + [ PN, GN, VIPGruppe, VIPListePT, GruppenNamen ] = InputFile.laden( Bestellung ) print(PN) print(GN) print(VIPGruppe) @@ -83,6 +89,9 @@ if __name__ == '__main__': S.speichern( AusgabeTP, AusgabePT ) if options.tosvg: S.alsSVG( AusgabeSVG ) + if options.showdev: + F1.Entwicklung.alsSVG( AusgabeEntwicklung ) + print( "Entwicklungsverlauf geschrieben:", AusgabeEntwicklung ) else: pass diff --git a/libs/webserver.py b/libs/webserver.py new file mode 100644 index 0000000..8b6c11d --- /dev/null +++ b/libs/webserver.py @@ -0,0 +1,376 @@ +""" +Plattformunabhaengige Prozessverwaltung fuer die Web-Testinstanz +(ersetzt die fruehere PowerShell-Loesung run_web_helper.ps1, damit +dasselbe Skript unter Windows und Linux funktioniert). + +Aufruf (ueber bin/run_web.bat bzw. bin/run_web.sh oder direkt): + + python libs/webserver.py start # Server im Hintergrund starten + python libs/webserver.py stop # Server beenden + python libs/webserver.py status # laeuft er? PID? Port? + python libs/webserver.py run # im Vordergrund (Strg+C beendet) + python libs/webserver.py # wie "run" + + --port N weicht vom Standardport 8000 ab + +Designentscheidung gegen Zombie-Prozesse: Im Hintergrundbetrieb +("start") laeuft uvicorn OHNE --reload als ein einzelner Prozess, +der per PID-Datei sauber beendet werden kann. Der Auto-Reload +(--reload) startet Arbeitsprozesse als multiprocessing-Spawn-Kinder, +die bei unsanftem Ende des Reloaders MIT geerbtem Server-Socket +weiterleben und den Port unsichtbar weiterbedienen koennen (unter +Windows tauchen sie weder als Socket-Besitzer noch mit "uvicorn" in +der Kommandozeile auf). Deshalb gibt es --reload nur im +Vordergrundmodus ("run"), wo Strg+C alles gemeinsam beendet. +""" + +__author__ = "Michael Stangl" +__copyright__ = "Copyright (c) 2026 Michael Stangl" +__license__ = "Python" + +import argparse +import json +import os +import signal +import socket +import subprocess +import sys +import time +import urllib.request + +BASISDIR = os.path.dirname( os.path.dirname( os.path.abspath( __file__ ) ) ) +WEBDIR = os.path.join( BASISDIR, 'web' ) +LOGDIR = os.path.join( BASISDIR, 'log' ) +PIDDATEI = os.path.join( LOGDIR, 'run_web.pid' ) +LOGDATEI = os.path.join( LOGDIR, 'run_web.log' ) +HOST = '127.0.0.1' +STANDARDPORT = 8000 +APPTITEL = 'Sitz & Platz' # steht im OpenAPI-Titel von web/main.py + + +# ---------------------------------------------------------------- Sonden +def PortOffen(Port): + """True, wenn auf dem Port etwas Verbindungen annimmt""" + with socket.socket( socket.AF_INET, socket.SOCK_STREAM ) as s: + s.settimeout( 1.0 ) + return s.connect_ex( (HOST, Port) ) == 0 + + +def IstUnsereApp(Port): + """True/False, ob auf dem Port unsere FastAPI-App antwortet; + None, wenn keine (verwertbare) Antwort kommt""" + try: + with urllib.request.urlopen( + 'http://%s:%d/openapi.json' % (HOST, Port), timeout=3 ) as antwort: + daten = json.load( antwort ) + return APPTITEL in daten.get( 'info', {} ).get( 'title', '' ) + except Exception: + return None + + +def PidLebt(Pid): + """True, wenn der Prozess existiert (portabel)""" + if Pid is None or Pid <= 0: + return False + if sys.platform == 'win32': + # os.kill(pid, 0) ist unter Windows unbrauchbar (wirft WinError 87 + # statt zu pruefen). Stattdessen im Toolhelp-Snapshot nachsehen. + return Pid in _ProzessTabelle() + try: + os.kill( Pid, 0 ) + return True + except PermissionError: + return True # existiert, gehoert aber jemand anderem + except OSError: + return False + + +# ------------------------------------------------------------- PID-Datei +def PidLesen(): + try: + with open( PIDDATEI ) as f: + return int( f.read().strip() ) + except (OSError, ValueError): + return None + + +def PidSchreiben(Pid): + os.makedirs( LOGDIR, exist_ok=True ) + with open( PIDDATEI, 'w' ) as f: + f.write( '%d\n' % Pid ) + + +def PidLoeschen(): + try: + os.remove( PIDDATEI ) + except OSError: + pass + + +def ListenerPid(Port): + """PID des Prozesses, der auf dem Port lauscht (Fallback, wenn die + PID-Datei fehlt); None wenn nicht feststellbar""" + try: + if sys.platform == 'win32': + ausgabe = subprocess.run( + ['netstat', '-ano', '-p', 'tcp'], + capture_output=True, text=True, timeout=10 ).stdout + for zeile in ausgabe.splitlines(): + teile = zeile.split() + # Zustandsspalte NICHT auf "LISTENING" pruefen - netstat + # ist lokalisiert (deutsch: "ABHOEREN"). Ein Listener ist + # an der Gegenstelle 0.0.0.0:0 erkennbar; PID = letzte Spalte. + if ( len(teile) >= 5 and teile[0] == 'TCP' + and teile[1].endswith( ':%d' % Port ) + and teile[2] in ('0.0.0.0:0', '[::]:0') ): + return int( teile[-1] ) + else: + ausgabe = subprocess.run( + ['ss', '-tlnp'], + capture_output=True, text=True, timeout=10 ).stdout + for zeile in ausgabe.splitlines(): + if ':%d ' % Port in zeile and 'pid=' in zeile: + return int( zeile.split('pid=')[1].split(',')[0] ) + except (OSError, ValueError, subprocess.SubprocessError): + pass + return None + + +# ------------------------------------------------- Prozessbaum-Hilfen +def _ProzessTabelle(): + """{ Pid: (ElternPid, Prozessname) } aller laufenden Prozesse - + Windows ueber einen Toolhelp-Snapshot (ctypes, Standardbibliothek), + Linux ueber /proc""" + tabelle = {} + if sys.platform == 'win32': + import ctypes + import ctypes.wintypes as wt + + class PROCESSENTRY32(ctypes.Structure): + _fields_ = [ + ('dwSize', wt.DWORD), ('cntUsage', wt.DWORD), + ('th32ProcessID', wt.DWORD), + ('th32DefaultHeapID', ctypes.POINTER( ctypes.c_ulong )), + ('th32ModuleID', wt.DWORD), ('cntThreads', wt.DWORD), + ('th32ParentProcessID', wt.DWORD), + ('pcPriClassBase', ctypes.c_long), + ('dwFlags', wt.DWORD), ('szExeFile', ctypes.c_char * 260) ] + + TH32CS_SNAPPROCESS = 0x2 + k32 = ctypes.windll.kernel32 + schnappschuss = k32.CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) + if schnappschuss == -1: + return tabelle + eintrag = PROCESSENTRY32() + eintrag.dwSize = ctypes.sizeof( PROCESSENTRY32 ) + if k32.Process32First( schnappschuss, ctypes.byref( eintrag ) ): + while True: + tabelle[ int(eintrag.th32ProcessID) ] = ( + int(eintrag.th32ParentProcessID), + eintrag.szExeFile.decode( errors='replace' ).lower() ) + if not k32.Process32Next( schnappschuss, + ctypes.byref( eintrag ) ): + break + k32.CloseHandle( schnappschuss ) + else: + for name in os.listdir( '/proc' ): + if not name.isdigit(): + continue + try: + with open( '/proc/%s/stat' % name ) as f: + stat = f.read() + # Format: pid (comm) zustand ppid ... - comm kann + # Leerzeichen enthalten, daher an der Klammer trennen + kommando = stat[ stat.index('(') + 1 : stat.rindex(')') ] + felder = stat[ stat.rindex(')') + 2 : ].split() + tabelle[ int(name) ] = ( int(felder[1]), kommando.lower() ) + except (OSError, ValueError, IndexError): + continue + return tabelle + + +def ProzessWurzel(Pid): + """laeuft vom Prozess die Elternkette hoch, solange die Eltern auch + Python-Prozesse sind, und liefert die Wurzel des Python-Baums. + Noetig fuer fremde/alte --reload-Server: wird nur der Arbeits- + prozess beendet, startet der Reloader ihn sofort neu.""" + tabelle = _ProzessTabelle() + aktuell = Pid + for _ in range( 10 ): # Schutz gegen Zyklen + eintrag = tabelle.get( aktuell ) + if eintrag is None: + break + eltern, _name = eintrag + elternEintrag = tabelle.get( eltern ) + if elternEintrag is None or not elternEintrag[1].startswith( 'python' ): + break + aktuell = eltern + return aktuell + + +# ------------------------------------------------------------- Aktionen +def UvicornKommando(Port, Reload): + Kommando = [ sys.executable, '-m', 'uvicorn', 'main:app', + '--app-dir', WEBDIR, '--port', str(Port) ] + if Reload: + Kommando.append( '--reload' ) + return Kommando + + +def Starten(Port): + if PortOffen( Port ): + if IstUnsereApp( Port ): + print( 'Server laeuft bereits: http://localhost:%d' % Port ) + else: + print( 'FEHLER: Port %d ist von einem fremden Programm belegt.' % Port ) + return 1 + + os.makedirs( LOGDIR, exist_ok=True ) + logdatei = open( LOGDATEI, 'w' ) + + # vom Terminal abkoppeln, damit der Server das Schliessen der + # Konsole ueberlebt; eigene Prozessgruppe fuer sauberes Beenden + if sys.platform == 'win32': + flags = ( subprocess.DETACHED_PROCESS + | subprocess.CREATE_NEW_PROCESS_GROUP ) + prozess = subprocess.Popen( + UvicornKommando( Port, Reload=False ), + stdout=logdatei, stderr=subprocess.STDOUT, + cwd=BASISDIR, creationflags=flags ) + else: + prozess = subprocess.Popen( + UvicornKommando( Port, Reload=False ), + stdout=logdatei, stderr=subprocess.STDOUT, + cwd=BASISDIR, start_new_session=True ) + PidSchreiben( prozess.pid ) + + # warten bis der Port antwortet (oder der Prozess frueh stirbt) + for _ in range( 30 ): + if prozess.poll() is not None: + print( 'FEHLER: Server sofort wieder beendet - siehe %s' % LOGDATEI ) + PidLoeschen() + return 1 + if PortOffen( Port ): + print( 'Server laeuft: http://localhost:%d (PID %d, Log: %s)' + % (Port, prozess.pid, os.path.relpath( LOGDATEI, BASISDIR )) ) + print( 'Hinweis: Hintergrundbetrieb ohne Auto-Reload - fuer ' + 'Entwicklung mit Reload "run" im Vordergrund nutzen.' ) + return 0 + time.sleep( 0.5 ) + print( 'FEHLER: Server antwortet nicht auf Port %d - siehe %s' + % (Port, LOGDATEI) ) + return 1 + + +def BaumBeenden(Pid): + """beendet einen Prozess samt Kindprozessen (portabel)""" + if sys.platform == 'win32': + subprocess.run( ['taskkill', '/PID', str(Pid), '/T', '/F'], + capture_output=True ) + else: + try: + os.killpg( os.getpgid( Pid ), signal.SIGTERM ) + except (ProcessLookupError, PermissionError, OSError): + try: + os.kill( Pid, signal.SIGTERM ) + except OSError: + pass + # kurze Gnadenfrist, dann hart nachsetzen + for _ in range( 10 ): + if not PidLebt( Pid ): + return + time.sleep( 0.3 ) + try: + os.killpg( os.getpgid( Pid ), signal.SIGKILL ) + except (ProcessLookupError, PermissionError, OSError): + pass + + +def Stoppen(Port): + gefunden = False + + Pid = PidLesen() + if Pid is not None and PidLebt( Pid ): + BaumBeenden( Pid ) + gefunden = True + + # Fallback: PID-Datei fehlt/veraltet, aber es lauscht noch jemand - + # dann die Wurzel des Python-Prozessbaums beenden (sonst startet ein + # --reload-Elternprozess den abgeschossenen Worker sofort neu) + if PortOffen( Port ): + LPid = ListenerPid( Port ) + if LPid is not None and PidLebt( LPid ): + BaumBeenden( ProzessWurzel( LPid ) ) + gefunden = True + + # nachpruefen, ob der Port wirklich frei geworden ist + for _ in range( 10 ): + if not PortOffen( Port ): + break + time.sleep( 0.3 ) + PidLoeschen() + + if PortOffen( Port ): + print( 'WARNUNG: Auf Port %d antwortet immer noch etwas. Moeglicher ' + 'verwaister Prozess mit geerbtem Socket - Kandidaten mit ' + '"netstat -ano" (Windows) bzw. "ss -tlnp" (Linux) suchen.' + % Port ) + return 1 + print( 'Beendet.' if gefunden else 'Es lief nichts.' ) + return 0 + + +def Status(Port): + Pid = PidLesen() + if PortOffen( Port ): + Zusatz = '' + if Pid is not None and PidLebt( Pid ): + # uvicorn haelt den Port oft in einem Kindprozess des in der + # PID-Datei vermerkten Hauptprozesses - das ist derselbe Server + Zusatz = ' (PID %d)' % Pid + elif ( LPid := ListenerPid( Port ) ) is not None: + Zusatz = ' (Listener-PID %d, keine PID-Datei)' % LPid + if IstUnsereApp( Port ): + print( 'LAEUFT: http://localhost:%d%s' % (Port, Zusatz) ) + return 0 + print( 'BELEGT: Port %d antwortet, aber nicht mit unserer App%s' + % (Port, Zusatz) ) + return 1 + if Pid is not None and PidLebt( Pid ): + print( 'UNKLAR: Prozess %d aus der PID-Datei lebt, aber Port %d ' + 'antwortet nicht (Startphase oder haengt?)' % (Pid, Port) ) + return 1 + print( 'GESTOPPT: kein Server auf Port %d' % Port ) + return 1 + + +def Vordergrund(Port): + print( 'Starte Web-Testinstanz im Vordergrund mit Auto-Reload ' + '(Strg+C zum Beenden) ...' ) + try: + return subprocess.call( UvicornKommando( Port, Reload=True ), + cwd=BASISDIR ) + except KeyboardInterrupt: + return 0 + + +# ------------------------------------------------------------------ Main +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn)' ) + parser.add_argument( 'aktion', nargs='?', default='run', + choices=['start', 'stop', 'status', 'run'], + help='start=Hintergrund, stop=beenden, status=anzeigen, ' + 'run=Vordergrund mit Auto-Reload (Standard)' ) + parser.add_argument( '--port', type=int, default=STANDARDPORT, + help='Port der Testinstanz (Standard: %d)' % STANDARDPORT ) + argumente = parser.parse_args() + + if argumente.aktion == 'start': + sys.exit( Starten( argumente.port ) ) + elif argumente.aktion == 'stop': + sys.exit( Stoppen( argumente.port ) ) + elif argumente.aktion == 'status': + sys.exit( Status( argumente.port ) ) + else: + sys.exit( Vordergrund( argumente.port ) ) diff --git a/tests/test_sitzplatzverteilung.py b/tests/test_sitzplatzverteilung.py index 24b1d7f..31392f3 100644 --- a/tests/test_sitzplatzverteilung.py +++ b/tests/test_sitzplatzverteilung.py @@ -18,7 +18,8 @@ import unittest sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'libs')) -from Strukturdaten import Gruppe, Gruppen, Person, Sitzplatzverteilung, Strafliste, Tisch, Tische +from Strukturdaten import Gruppe, Gruppen, JSONConfig, Person, Sitzplatzverteilung, Strafliste, Tisch, Tische +from ga import Entwicklung, _StringAusdruck IMAGES_DIR = os.path.join(os.path.dirname(__file__), '..', 'doc', 'images') @@ -169,5 +170,109 @@ class TestSechsTischeKreisDreiergruppen(unittest.TestCase): "Tische %s der Gruppe %s sind keine Nachbarn" % (SV.Gid_Tid[G.Id], G.Id) ) +class TestJSONConfig(unittest.TestCase): + """Parsen der bestellung.json: Gruppen, VIP-Bindung, Anzahl-Expansion.""" + + def test_gruppen_vips_und_sammelbuchung(self): + Daten = { + "gruppen": [ + { + "name": "Brautpaar", + "tisch": 1, + "personen": [ + {"vorname": "Julia", "nachname": "Brandt"}, + {"vorname": "Daniel", "nachname": "Sommer", "titel": "Dr."}, + ], + }, + { + "name": "Familie Huber", + "personen": [ + {"vorname": "Anna", "nachname": "Huber"}, + {"vorname": "Berta", "nachname": "Huber"}, + ], + }, + { + "name": "Musikverein", + "anzahl": 5, + "personen": [ {"vorname": "Gast", "nachname": "Musikverein"} ], + }, + ] + } + PN, GN, VIPGruppe, VipHash, GruppenNamen = JSONConfig().HandleBestellung(Daten) + + # VIP-Gruppe: beide ans Tisch 1 gebunden, nicht in den GA-Gruppen + self.assertEqual( VIPGruppe.Anzahl(), 2 ) + self.assertEqual( set(VipHash.values()), {1} ) + self.assertEqual( len(VipHash), 2 ) + + # regulaere Gruppen: Familie Huber (2) + Musikverein (5x expandiert) = 7 + self.assertEqual( GN.NLeute, 7 ) + self.assertEqual( len(GN.GruppenListe), 2 ) + + # Sammelbuchung: die eine Musikverein-Person wurde 5x vervielfacht + Groessen = sorted( G.Anzahl() for G in GN.GruppenListe ) + self.assertEqual( Groessen, [2, 5] ) + + # Anzeigenamen kommen durch + self.assertIn( "Familie Huber", GruppenNamen.values() ) + self.assertIn( "Musikverein", GruppenNamen.values() ) + + def test_fehlende_pflichtfelder_werfen_fehler(self): + with self.assertRaises(ValueError): + JSONConfig().HandleBestellung( {"keine_gruppen": []} ) + with self.assertRaises(ValueError): + JSONConfig().HandleBestellung( + {"gruppen": [ {"personen": [ {"vorname": "Nur"} ]} ]} ) + + +class TestStringAusdruck(unittest.TestCase): + """Der sichere Zyklus-Ausdruck-Auswerter (Ersatz fuer eval).""" + + def test_verkettung_und_vervielfachung(self): + self.assertEqual( + _StringAusdruck("'e,'+'s,z,m,j,z,'*3+'s'"), + 'e,s,z,m,j,z,s,z,m,j,z,s,z,m,j,z,s' ) + self.assertEqual( _StringAusdruck("'e,s'"), 'e,s' ) + + def test_lehnt_code_ab(self): + # kein Funktionsaufruf, keine Namen, kein Import + for boese in ("__import__('os')", "open('x')", "1+1", "a+'b'"): + with self.assertRaises(ValueError): + _StringAusdruck(boese) + + +class TestEntwicklung(unittest.TestCase): + """Das Beobachtungsobjekt zeichnet den Verlauf auf und rendert SVG.""" + + class _L: + def __init__(self, value): + self.value = value + + def test_erfassen_und_svg(self): + E = Entwicklung() + E.erfassen( 'e', [self._L(-200), self._L(-150), self._L(-90)] ) + E.erfassen( 's', [self._L(-90), self._L(-70)] ) + E.erfassen( 'm', [self._L(-70), self._L(-40)] ) + + self.assertEqual( len(E.Punkte), 3 ) + # je Punkt: (index, aktion, best, schnitt, schlecht, N) + _i, aktion, best, schnitt, schlecht, n = E.Punkte[0] + self.assertEqual( aktion, 'e' ) + self.assertEqual( best, -90 ) + self.assertEqual( schlecht, -200 ) + self.assertEqual( n, 3 ) + + Pfad = os.path.join( IMAGES_DIR, 'test_entwicklung.svg' ) + E.alsSVG( Pfad ) + with open(Pfad) as f: + svg = f.read() + self.assertIn( ' Personen) GET /sitzung/{id}/ergebnis.svg — Ergebnis als SVG (alsSVG aus dem Kern) @@ -348,7 +348,7 @@ def TischDateiHochladen(SitzungsId: str, datei: UploadFile = File(...)): @app.post( '/sitzung/{SitzungsId}/personen' ) def PersonenHochladen(SitzungsId: str, datei: UploadFile = File(...)): - """Gaesteliste als CSV hochladen (Ersatz fuer bestellung.xml); + """Gaesteliste als CSV hochladen (Ersatz fuer bestellung.json); Format siehe libs/CSVConfig.py""" S = _GibSession( SitzungsId ) Rohdaten = datei.file.read() diff --git a/work/hochzeit/Entwicklung.svg b/work/hochzeit/Entwicklung.svg new file mode 100644 index 0000000..490cc1e --- /dev/null +++ b/work/hochzeit/Entwicklung.svg @@ -0,0 +1,47 @@ + + + +Entwicklung der Loesungsfindung + + + +-83 + +-75 + +-68 + +-60 + +-53 + +-45 +Wertigkeit (hoeher = besser) +Zyklus-Aktion (Zeit) +e +s +z +m +j +z +s +z +m +j +z +s +z +m +j +z +s + + + + +beste Loesung + +Durchschnitt + +schlechteste Loesung + diff --git a/work/hochzeit/PersonenTische.csv b/work/hochzeit/PersonenTische.csv index 4b078bb..4ad42f4 100644 --- a/work/hochzeit/PersonenTische.csv +++ b/work/hochzeit/PersonenTische.csv @@ -1,78 +1,77 @@ -Aksoy, Rainer, = Hof 1, Tisch 13, Nummer 7 -Aksoy, Renate, = Hof 1, Tisch 13, Nummer 2 -Aydin, Horst, = Hof 1, Tisch 14, Nummer 6 -Aydin, Ursula, = Hof 1, Tisch 14, Nummer 8 -Barth, Hannelore, = Hof 1, Tisch 9, Nummer 7 -Berger, Sergej, = Hof 1, Tisch 2, Nummer 5 -Brandt, Andreas, = Hof 1, Tisch 15, Nummer 2 -Brandt, Anja, = Hof 1, Tisch 15, Nummer 3 -Brandt, Anton, = Hof 1, Tisch 16, Nummer 14 +Aksoy, Rainer, = Hof 1, Tisch 14, Nummer 4 +Aksoy, Renate, = Hof 1, Tisch 14, Nummer 2 +Aydin, Horst, = Hof 1, Tisch 2, Nummer 8 +Aydin, Ursula, = Hof 1, Tisch 2, Nummer 3 +Barth, Hannelore, = Hof 1, Tisch 9, Nummer 8 +Berger, Sergej, = Hof 1, Tisch 8, Nummer 5 +Brandt, Andreas, = Hof 1, Tisch 2, Nummer 2 +Brandt, Anja, = Hof 1, Tisch 15, Nummer 8 +Brandt, Anton, = Hof 1, Tisch 16, Nummer 2 Brandt, Ben, = Hof 1, Tisch 17, Nummer 5 -Brandt, Daniel, = Hof 1, Tisch 11, Nummer 7 -Brandt, Felix, = Hof 1, Tisch 16, Nummer 13 -Brandt, Frieda, = Hof 1, Tisch 16, Nummer 8 -Brandt, Greta, = Hof 1, Tisch 16, Nummer 3 -Brandt, Helga, = Hof 1, Tisch 1, Nummer 2 +Brandt, Daniel, = Hof 1, Tisch 1, Nummer 4 +Brandt, Felix, = Hof 1, Tisch 16, Nummer 5 +Brandt, Frieda, = Hof 1, Tisch 16, Nummer 3 +Brandt, Greta, = Hof 1, Tisch 16, Nummer 9 +Brandt, Helga, = Hof 1, Tisch 1, Nummer 3 Brandt, Julia, = Hof 1, Tisch 1, Nummer 9 -Brandt, Kathrin, = Hof 1, Tisch 11, Nummer 4 -Brandt, Lena, = Hof 1, Tisch 15, Nummer 6 -Brandt, Milan, = Hof 1, Tisch 15, Nummer 5 -Brandt, Paul, = Hof 1, Tisch 17, Nummer 6 -Brandt, Sofia, = Hof 1, Tisch 15, Nummer 8 -Brandt, Theo, = Hof 1, Tisch 15, Nummer 4 -Brandt, Werner, = Hof 1, Tisch 1, Nummer 6 -Busch, Stefanie, = Hof 1, Tisch 2, Nummer 3 -Demir, Elif, = Hof 1, Tisch 10, Nummer 2 -Demir, Hannelore, = Hof 1, Tisch 14, Nummer 5 -Demir, Ingrid, = Hof 1, Tisch 14, Nummer 2 -Demir, Monika, = Hof 1, Tisch 14, Nummer 3 -Dietrich, Jennifer, = Hof 1, Tisch 2, Nummer 6 -Dietrich, Nicole, = Hof 1, Tisch 12, Nummer 2 -Erdem, Erika, = Hof 1, Tisch 15, Nummer 9 -Erdem, Gerhard, = Hof 1, Tisch 9, Nummer 2 -Erdem, Rainer, = Hof 1, Tisch 9, Nummer 3 -Esposito, Christian, = Hof 1, Tisch 12, Nummer 8 -Esposito, Gisela, = Hof 1, Tisch 9, Nummer 6 -Esposito, Julia, = Hof 1, Tisch 8, Nummer 4 -Fischer, Heinz, = Hof 1, Tisch 14, Nummer 4 -Fischer, Helga, = Hof 1, Tisch 14, Nummer 7 -Fischer, Nicole, = Hof 1, Tisch 12, Nummer 4 -Fischer, Sven, = Hof 1, Tisch 10, Nummer 3 -Frank, Erika, = Hof 1, Tisch 9, Nummer 8 -Frank, Nadine, = Hof 1, Tisch 11, Nummer 9 +Brandt, Kathrin, = Hof 1, Tisch 1, Nummer 2 +Brandt, Lena, = Hof 1, Tisch 2, Nummer 6 +Brandt, Milan, = Hof 1, Tisch 15, Nummer 4 +Brandt, Paul, = Hof 1, Tisch 17, Nummer 4 +Brandt, Sofia, = Hof 1, Tisch 15, Nummer 9 +Brandt, Theo, = Hof 1, Tisch 2, Nummer 5 +Brandt, Werner, = Hof 1, Tisch 1, Nummer 12 +Busch, Stefanie, = Hof 1, Tisch 8, Nummer 8 +Demir, Elif, = Hof 1, Tisch 10, Nummer 8 +Demir, Hannelore, = Hof 1, Tisch 13, Nummer 5 +Demir, Ingrid, = Hof 1, Tisch 13, Nummer 2 +Demir, Monika, = Hof 1, Tisch 13, Nummer 3 +Dietrich, Jennifer, = Hof 1, Tisch 13, Nummer 7 +Dietrich, Nicole, = Hof 1, Tisch 12, Nummer 6 +Erdem, Erika, = Hof 1, Tisch 3, Nummer 4 +Erdem, Gerhard, = Hof 1, Tisch 9, Nummer 6 +Erdem, Rainer, = Hof 1, Tisch 9, Nummer 7 +Esposito, Christian, = Hof 1, Tisch 12, Nummer 7 +Esposito, Gisela, = Hof 1, Tisch 9, Nummer 2 +Esposito, Julia, = Hof 1, Tisch 8, Nummer 9 +Fischer, Heinz, = Hof 1, Tisch 3, Nummer 2 +Fischer, Helga, = Hof 1, Tisch 3, Nummer 5 +Fischer, Nicole, = Hof 1, Tisch 12, Nummer 8 +Fischer, Sven, = Hof 1, Tisch 8, Nummer 3 +Frank, Erika, = Hof 1, Tisch 9, Nummer 3 +Frank, Nadine, = Hof 1, Tisch 11, Nummer 7 Frank, Timo, = Hof 1, Tisch 10, Nummer 4 -Frank, Tobias, = Hof 1, Tisch 1, Nummer 11 +Frank, Tobias, = Hof 1, Tisch 1, Nummer 5 Franke, Brigitte, = Hof 1, Tisch 9, Nummer 9 -Hansen, Olga, = Hof 1, Tisch 11, Nummer 5 +Hansen, Olga, = Hof 1, Tisch 11, Nummer 3 Hansen, Wolfgang, = Hof 1, Tisch 9, Nummer 5 -Hoffmann, Lena, = Hof 1, Tisch 12, Nummer 7 -Horn, Daniel, = Hof 1, Tisch 11, Nummer 3 -Horn, Svenja, = Hof 1, Tisch 2, Nummer 2 -Klein, Stefan, = Hof 1, Tisch 10, Nummer 5 -Koch, Andreas, = Hof 1, Tisch 2, Nummer 7 -Koch, Giovanna, = Hof 1, Tisch 8, Nummer 2 -Kovac, Giovanna, = Hof 1, Tisch 8, Nummer 8 -Kraus, Dennis, = Hof 1, Tisch 4, Nummer 4 -Kraus, Matteo, = Hof 1, Tisch 16, Nummer 4 -Kraus, Melanie, = Hof 1, Tisch 4, Nummer 2 -Kuhn, Leni, = Hof 1, Tisch 16, Nummer 11 -Kuhn, Sarah, = Hof 1, Tisch 1, Nummer 10 -Kuhn, Stefan, = Hof 1, Tisch 2, Nummer 9 -Kuhn, Timo, = Hof 1, Tisch 1, Nummer 7 -Lange, Milan, = Hof 1, Tisch 11, Nummer 8 -Meyer, Anton, = Hof 1, Tisch 17, Nummer 7 -Meyer, Christian, = Hof 1, Tisch 2, Nummer 4 -Meyer, Ida, = Hof 1, Tisch 17, Nummer 4 +Hoffmann, Lena, = Hof 1, Tisch 12, Nummer 4 +Horn, Daniel, = Hof 1, Tisch 11, Nummer 5 +Horn, Svenja, = Hof 1, Tisch 13, Nummer 4 +Klein, Stefan, = Hof 1, Tisch 10, Nummer 2 +Koch, Andreas, = Hof 1, Tisch 8, Nummer 7 +Koch, Giovanna, = Hof 1, Tisch 4, Nummer 6 +Kovac, Giovanna, = Hof 1, Tisch 8, Nummer 4 +Kraus, Dennis, = Hof 1, Tisch 11, Nummer 6 +Kraus, Matteo, = Hof 1, Tisch 16, Nummer 8 +Kraus, Melanie, = Hof 1, Tisch 11, Nummer 8 +Kuhn, Leni, = Hof 1, Tisch 16, Nummer 10 +Kuhn, Sarah, = Hof 1, Tisch 14, Nummer 3 +Kuhn, Stefan, = Hof 1, Tisch 13, Nummer 8 +Kuhn, Timo, = Hof 1, Tisch 14, Nummer 5 +Lange, Milan, = Hof 1, Tisch 11, Nummer 2 +Meyer, Anton, = Hof 1, Tisch 17, Nummer 6 +Meyer, Christian, = Hof 1, Tisch 13, Nummer 6 +Meyer, Ida, = Hof 1, Tisch 17, Nummer 3 Meyer, Marco, = Hof 1, Tisch 12, Nummer 9 -Meyer, Mila, = Hof 1, Tisch 16, Nummer 10 -Meyer, Sandra, = Hof 1, Tisch 12, Nummer 6 +Meyer, Mila, = Hof 1, Tisch 16, Nummer 11 +Meyer, Sandra, = Hof 1, Tisch 12, Nummer 3 Meyer, Wolfgang, = Hof 1, Tisch 9, Nummer 4 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 2 Musikverein, Gast, = Hof 1, Tisch 4, Nummer 3 -Musikverein, Gast, = Hof 1, Tisch 4, Nummer 5 -Musikverein, Gast, = Hof 1, Tisch 4, Nummer 6 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 4 Musikverein, Gast, = Hof 1, Tisch 4, Nummer 7 Musikverein, Gast, = Hof 1, Tisch 4, Nummer 8 -Musikverein, Gast, = Hof 1, Tisch 4, Nummer 9 Musikverein, Gast, = Hof 1, Tisch 5, Nummer 2 Musikverein, Gast, = Hof 1, Tisch 5, Nummer 3 Musikverein, Gast, = Hof 1, Tisch 5, Nummer 4 @@ -80,41 +79,42 @@ Musikverein, Gast, = Hof 1, Tisch 5, Nummer 5 Musikverein, Gast, = Hof 1, Tisch 5, Nummer 6 Musikverein, Gast, = Hof 1, Tisch 5, Nummer 7 Musikverein, Gast, = Hof 1, Tisch 5, Nummer 8 -Peters, Melanie, = Hof 1, Tisch 8, Nummer 7 -Peters, Yusuf, = Hof 1, Tisch 8, Nummer 9 -Polat, Matthias, = Hof 1, Tisch 12, Nummer 3 -Roth, Stefanie, = Hof 1, Tisch 2, Nummer 8 -Schmidt, Dennis, = Hof 1, Tisch 8, Nummer 3 -Schmitt, Markus, = Hof 1, Tisch 11, Nummer 6 -Schwarz, Elias, = Hof 1, Tisch 16, Nummer 12 -Schwarz, Guenter, = Hof 1, Tisch 13, Nummer 5 -Schwarz, Liam, = Hof 1, Tisch 16, Nummer 6 -Schwarz, Sarah, = Hof 1, Tisch 13, Nummer 9 -Schwarz, Yusuf, = Hof 1, Tisch 13, Nummer 8 -Simon, Jennifer, = Hof 1, Tisch 10, Nummer 6 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 9 +Peters, Melanie, = Hof 1, Tisch 1, Nummer 6 +Peters, Yusuf, = Hof 1, Tisch 1, Nummer 7 +Polat, Matthias, = Hof 1, Tisch 12, Nummer 2 +Roth, Stefanie, = Hof 1, Tisch 13, Nummer 9 +Schmidt, Dennis, = Hof 1, Tisch 4, Nummer 5 +Schmitt, Markus, = Hof 1, Tisch 11, Nummer 9 +Schwarz, Elias, = Hof 1, Tisch 16, Nummer 14 +Schwarz, Guenter, = Hof 1, Tisch 14, Nummer 7 +Schwarz, Liam, = Hof 1, Tisch 16, Nummer 7 +Schwarz, Sarah, = Hof 1, Tisch 2, Nummer 4 +Schwarz, Yusuf, = Hof 1, Tisch 2, Nummer 7 +Simon, Jennifer, = Hof 1, Tisch 10, Nummer 3 Simon, Patrick, = Hof 1, Tisch 8, Nummer 6 -Simon, Stefanie, = Hof 1, Tisch 10, Nummer 9 -Sommer, Daniel, = Hof 1, Tisch 1, Nummer 12 -Sommer, Dennis, = Hof 1, Tisch 13, Nummer 3 -Sommer, Dennis, = Hof 1, Tisch 3, Nummer 4 -Sommer, Dieter, = Hof 1, Tisch 1, Nummer 4 -Sommer, Emil, = Hof 1, Tisch 16, Nummer 2 -Sommer, Ida, = Hof 1, Tisch 16, Nummer 9 -Sommer, Jennifer, = Hof 1, Tisch 13, Nummer 6 -Sommer, Lina, = Hof 1, Tisch 3, Nummer 2 -Sommer, Max, = Hof 1, Tisch 16, Nummer 7 -Sommer, Nicole, = Hof 1, Tisch 3, Nummer 3 -Sommer, Renate, = Hof 1, Tisch 1, Nummer 3 -Sommer, Theo, = Hof 1, Tisch 16, Nummer 5 -Stein, Andreas, = Hof 1, Tisch 10, Nummer 8 -Stein, Werner, = Hof 1, Tisch 13, Nummer 4 -Tran, Heinz, = Hof 1, Tisch 15, Nummer 7 -Vogel, Anton, = Hof 1, Tisch 17, Nummer 3 -Vogel, Max, = Hof 1, Tisch 17, Nummer 2 -Vogel, Sandra, = Hof 1, Tisch 1, Nummer 8 -Vogel, Svenja, = Hof 1, Tisch 8, Nummer 5 -Vogel, Yusuf, = Hof 1, Tisch 1, Nummer 5 -Wagner, Daniel, = Hof 1, Tisch 10, Nummer 7 +Simon, Stefanie, = Hof 1, Tisch 10, Nummer 7 +Sommer, Daniel, = Hof 1, Tisch 1, Nummer 13 +Sommer, Dennis, = Hof 1, Tisch 15, Nummer 5 +Sommer, Dennis, = Hof 1, Tisch 15, Nummer 7 +Sommer, Dieter, = Hof 1, Tisch 1, Nummer 10 +Sommer, Emil, = Hof 1, Tisch 16, Nummer 12 +Sommer, Ida, = Hof 1, Tisch 16, Nummer 6 +Sommer, Jennifer, = Hof 1, Tisch 15, Nummer 2 +Sommer, Lina, = Hof 1, Tisch 15, Nummer 3 +Sommer, Max, = Hof 1, Tisch 16, Nummer 13 +Sommer, Nicole, = Hof 1, Tisch 15, Nummer 6 +Sommer, Renate, = Hof 1, Tisch 1, Nummer 8 +Sommer, Theo, = Hof 1, Tisch 16, Nummer 4 +Stein, Andreas, = Hof 1, Tisch 10, Nummer 6 +Stein, Werner, = Hof 1, Tisch 14, Nummer 6 +Tran, Heinz, = Hof 1, Tisch 3, Nummer 3 +Vogel, Anton, = Hof 1, Tisch 17, Nummer 2 +Vogel, Max, = Hof 1, Tisch 17, Nummer 7 +Vogel, Sandra, = Hof 1, Tisch 14, Nummer 9 +Vogel, Svenja, = Hof 1, Tisch 8, Nummer 2 +Vogel, Yusuf, = Hof 1, Tisch 14, Nummer 8 +Wagner, Daniel, = Hof 1, Tisch 10, Nummer 5 Wagner, Timo, = Hof 1, Tisch 12, Nummer 5 -Winkler, Sarah, = Hof 1, Tisch 1, Nummer 13 -Yilmaz, Olga, = Hof 1, Tisch 11, Nummer 2 +Winkler, Sarah, = Hof 1, Tisch 1, Nummer 11 +Yilmaz, Olga, = Hof 1, Tisch 11, Nummer 4 diff --git a/work/hochzeit/Sitzplatzverteilung.svg b/work/hochzeit/Sitzplatzverteilung.svg index 6c6c961..3c076bb 100644 --- a/work/hochzeit/Sitzplatzverteilung.svg +++ b/work/hochzeit/Sitzplatzverteilung.svg @@ -2,146 +2,161 @@ -Tisch 6 + +6 -Tisch 7 + +7 -Tisch 3 - - + + +3 -Tisch 17 - -Tisch 5 - - - - - - - - -Tisch 14 - - - - - - - - -Tisch 2 - - - - - - - - + +17 -Tisch 4 - - - - - - - - + + + + + + + + +4 + + + + + + + + + + +2 + + + + + + + + + + +5 -Tisch 8 - - - - - - - - + + + + + + + + + +8 -Tisch 9 - - - - - - - - + + + + + + + + + +9 -Tisch 10 - - - - - - - - + + + + + + + + + +10 -Tisch 11 - - - - - - - - + + + + + + + + + +11 -Tisch 12 - - - - - - - - + + + + + + + + + +12 -Tisch 13 - - - - - - - - + + + + + + + + + +13 + + + + + + + + + + +14 -Tisch 15 - - - - + + + + + +15 -Tisch 1 - + - - - - + + + + - + + +1 -Tisch 16 @@ -155,4 +170,6 @@ + +16 diff --git a/work/hochzeit/TischePersonen.txt b/work/hochzeit/TischePersonen.txt index bf253d1..5b0c2bd 100644 --- a/work/hochzeit/TischePersonen.txt +++ b/work/hochzeit/TischePersonen.txt @@ -1,41 +1,40 @@ [1] - Helga Brandt = Hof 1, Tisch 1, Nummer 1 - Renate Sommer = Hof 1, Tisch 1, Nummer 2 - Dieter Sommer = Hof 1, Tisch 1, Nummer 3 - Yusuf Vogel = Hof 1, Tisch 1, Nummer 4 - Werner Brandt = Hof 1, Tisch 1, Nummer 5 - Timo Kuhn = Hof 1, Tisch 1, Nummer 6 - Sandra Vogel = Hof 1, Tisch 1, Nummer 7 + Kathrin Brandt = Hof 1, Tisch 1, Nummer 1 + Helga Brandt = Hof 1, Tisch 1, Nummer 2 + Daniel Brandt = Hof 1, Tisch 1, Nummer 3 + Tobias Frank = Hof 1, Tisch 1, Nummer 4 + Melanie Peters = Hof 1, Tisch 1, Nummer 5 + Yusuf Peters = Hof 1, Tisch 1, Nummer 6 + Renate Sommer = Hof 1, Tisch 1, Nummer 7 Julia Brandt = Hof 1, Tisch 1, Nummer 8 - Sarah Kuhn = Hof 1, Tisch 1, Nummer 9 - Tobias Frank = Hof 1, Tisch 1, Nummer 10 - Daniel Sommer = Hof 1, Tisch 1, Nummer 11 - Sarah Winkler = Hof 1, Tisch 1, Nummer 12 + Dieter Sommer = Hof 1, Tisch 1, Nummer 9 + Sarah Winkler = Hof 1, Tisch 1, Nummer 10 + Werner Brandt = Hof 1, Tisch 1, Nummer 11 + Daniel Sommer = Hof 1, Tisch 1, Nummer 12 [2] - Svenja Horn = Hof 1, Tisch 2, Nummer 1 - Stefanie Busch = Hof 1, Tisch 2, Nummer 2 - Christian Meyer = Hof 1, Tisch 2, Nummer 3 - Sergej Berger = Hof 1, Tisch 2, Nummer 4 - Jennifer Dietrich = Hof 1, Tisch 2, Nummer 5 - Andreas Koch = Hof 1, Tisch 2, Nummer 6 - Stefanie Roth = Hof 1, Tisch 2, Nummer 7 - Stefan Kuhn = Hof 1, Tisch 2, Nummer 8 + Andreas Brandt = Hof 1, Tisch 2, Nummer 1 + Ursula Aydin = Hof 1, Tisch 2, Nummer 2 + Sarah Schwarz = Hof 1, Tisch 2, Nummer 3 + Theo Brandt = Hof 1, Tisch 2, Nummer 4 + Lena Brandt = Hof 1, Tisch 2, Nummer 5 + Yusuf Schwarz = Hof 1, Tisch 2, Nummer 6 + Horst Aydin = Hof 1, Tisch 2, Nummer 7 [3] - Lina Sommer = Hof 1, Tisch 3, Nummer 1 - Nicole Sommer = Hof 1, Tisch 3, Nummer 2 - Dennis Sommer = Hof 1, Tisch 3, Nummer 3 + Heinz Fischer = Hof 1, Tisch 3, Nummer 1 + Heinz Tran = Hof 1, Tisch 3, Nummer 2 + Erika Erdem = Hof 1, Tisch 3, Nummer 3 + Helga Fischer = Hof 1, Tisch 3, Nummer 4 [4] - Melanie Kraus = Hof 1, Tisch 4, Nummer 1 + Gast Musikverein = Hof 1, Tisch 4, Nummer 1 Gast Musikverein = Hof 1, Tisch 4, Nummer 2 - Dennis Kraus = Hof 1, Tisch 4, Nummer 3 - Gast Musikverein = Hof 1, Tisch 4, Nummer 4 - Gast Musikverein = Hof 1, Tisch 4, Nummer 5 + Gast Musikverein = Hof 1, Tisch 4, Nummer 3 + Dennis Schmidt = Hof 1, Tisch 4, Nummer 4 + Giovanna Koch = Hof 1, Tisch 4, Nummer 5 Gast Musikverein = Hof 1, Tisch 4, Nummer 6 Gast Musikverein = Hof 1, Tisch 4, Nummer 7 - Gast Musikverein = Hof 1, Tisch 4, Nummer 8 [5] Gast Musikverein = Hof 1, Tisch 5, Nummer 1 @@ -45,110 +44,111 @@ Gast Musikverein = Hof 1, Tisch 5, Nummer 5 Gast Musikverein = Hof 1, Tisch 5, Nummer 6 Gast Musikverein = Hof 1, Tisch 5, Nummer 7 + Gast Musikverein = Hof 1, Tisch 5, Nummer 8 [6] [7] [8] - Giovanna Koch = Hof 1, Tisch 8, Nummer 1 - Dennis Schmidt = Hof 1, Tisch 8, Nummer 2 - Julia Esposito = Hof 1, Tisch 8, Nummer 3 - Svenja Vogel = Hof 1, Tisch 8, Nummer 4 + Svenja Vogel = Hof 1, Tisch 8, Nummer 1 + Sven Fischer = Hof 1, Tisch 8, Nummer 2 + Giovanna Kovac = Hof 1, Tisch 8, Nummer 3 + Sergej Berger = Hof 1, Tisch 8, Nummer 4 Patrick Simon = Hof 1, Tisch 8, Nummer 5 - Melanie Peters = Hof 1, Tisch 8, Nummer 6 - Giovanna Kovac = Hof 1, Tisch 8, Nummer 7 - Yusuf Peters = Hof 1, Tisch 8, Nummer 8 + Andreas Koch = Hof 1, Tisch 8, Nummer 6 + Stefanie Busch = Hof 1, Tisch 8, Nummer 7 + Julia Esposito = Hof 1, Tisch 8, Nummer 8 [9] - Gerhard Erdem = Hof 1, Tisch 9, Nummer 1 - Rainer Erdem = Hof 1, Tisch 9, Nummer 2 + Gisela Esposito = Hof 1, Tisch 9, Nummer 1 + Erika Frank = Hof 1, Tisch 9, Nummer 2 Wolfgang Meyer = Hof 1, Tisch 9, Nummer 3 Wolfgang Hansen = Hof 1, Tisch 9, Nummer 4 - Gisela Esposito = Hof 1, Tisch 9, Nummer 5 - Hannelore Barth = Hof 1, Tisch 9, Nummer 6 - Erika Frank = Hof 1, Tisch 9, Nummer 7 + Gerhard Erdem = Hof 1, Tisch 9, Nummer 5 + Rainer Erdem = Hof 1, Tisch 9, Nummer 6 + Hannelore Barth = Hof 1, Tisch 9, Nummer 7 Brigitte Franke = Hof 1, Tisch 9, Nummer 8 [10] - Elif Demir = Hof 1, Tisch 10, Nummer 1 - Sven Fischer = Hof 1, Tisch 10, Nummer 2 + Stefan Klein = Hof 1, Tisch 10, Nummer 1 + Jennifer Simon = Hof 1, Tisch 10, Nummer 2 Timo Frank = Hof 1, Tisch 10, Nummer 3 - Stefan Klein = Hof 1, Tisch 10, Nummer 4 - Jennifer Simon = Hof 1, Tisch 10, Nummer 5 - Daniel Wagner = Hof 1, Tisch 10, Nummer 6 - Andreas Stein = Hof 1, Tisch 10, Nummer 7 - Stefanie Simon = Hof 1, Tisch 10, Nummer 8 + Daniel Wagner = Hof 1, Tisch 10, Nummer 4 + Andreas Stein = Hof 1, Tisch 10, Nummer 5 + Stefanie Simon = Hof 1, Tisch 10, Nummer 6 + Elif Demir = Hof 1, Tisch 10, Nummer 7 [11] - Olga Yilmaz = Hof 1, Tisch 11, Nummer 1 - Daniel Horn = Hof 1, Tisch 11, Nummer 2 - Kathrin Brandt = Hof 1, Tisch 11, Nummer 3 - Olga Hansen = Hof 1, Tisch 11, Nummer 4 - Markus Schmitt = Hof 1, Tisch 11, Nummer 5 - Daniel Brandt = Hof 1, Tisch 11, Nummer 6 - Milan Lange = Hof 1, Tisch 11, Nummer 7 - Nadine Frank = Hof 1, Tisch 11, Nummer 8 + Milan Lange = Hof 1, Tisch 11, Nummer 1 + Olga Hansen = Hof 1, Tisch 11, Nummer 2 + Olga Yilmaz = Hof 1, Tisch 11, Nummer 3 + Daniel Horn = Hof 1, Tisch 11, Nummer 4 + Dennis Kraus = Hof 1, Tisch 11, Nummer 5 + Nadine Frank = Hof 1, Tisch 11, Nummer 6 + Melanie Kraus = Hof 1, Tisch 11, Nummer 7 + Markus Schmitt = Hof 1, Tisch 11, Nummer 8 [12] - Nicole Dietrich = Hof 1, Tisch 12, Nummer 1 - Matthias Polat = Hof 1, Tisch 12, Nummer 2 - Nicole Fischer = Hof 1, Tisch 12, Nummer 3 + Matthias Polat = Hof 1, Tisch 12, Nummer 1 + Sandra Meyer = Hof 1, Tisch 12, Nummer 2 + Lena Hoffmann = Hof 1, Tisch 12, Nummer 3 Timo Wagner = Hof 1, Tisch 12, Nummer 4 - Sandra Meyer = Hof 1, Tisch 12, Nummer 5 - Lena Hoffmann = Hof 1, Tisch 12, Nummer 6 - Christian Esposito = Hof 1, Tisch 12, Nummer 7 + Nicole Dietrich = Hof 1, Tisch 12, Nummer 5 + Christian Esposito = Hof 1, Tisch 12, Nummer 6 + Nicole Fischer = Hof 1, Tisch 12, Nummer 7 Marco Meyer = Hof 1, Tisch 12, Nummer 8 [13] - Renate Aksoy = Hof 1, Tisch 13, Nummer 1 - Dennis Sommer = Hof 1, Tisch 13, Nummer 2 - Werner Stein = Hof 1, Tisch 13, Nummer 3 - Guenter Schwarz = Hof 1, Tisch 13, Nummer 4 - Jennifer Sommer = Hof 1, Tisch 13, Nummer 5 - Rainer Aksoy = Hof 1, Tisch 13, Nummer 6 - Yusuf Schwarz = Hof 1, Tisch 13, Nummer 7 - Sarah Schwarz = Hof 1, Tisch 13, Nummer 8 + Ingrid Demir = Hof 1, Tisch 13, Nummer 1 + Monika Demir = Hof 1, Tisch 13, Nummer 2 + Svenja Horn = Hof 1, Tisch 13, Nummer 3 + Hannelore Demir = Hof 1, Tisch 13, Nummer 4 + Christian Meyer = Hof 1, Tisch 13, Nummer 5 + Jennifer Dietrich = Hof 1, Tisch 13, Nummer 6 + Stefan Kuhn = Hof 1, Tisch 13, Nummer 7 + Stefanie Roth = Hof 1, Tisch 13, Nummer 8 [14] - Ingrid Demir = Hof 1, Tisch 14, Nummer 1 - Monika Demir = Hof 1, Tisch 14, Nummer 2 - Heinz Fischer = Hof 1, Tisch 14, Nummer 3 - Hannelore Demir = Hof 1, Tisch 14, Nummer 4 - Horst Aydin = Hof 1, Tisch 14, Nummer 5 - Helga Fischer = Hof 1, Tisch 14, Nummer 6 - Ursula Aydin = Hof 1, Tisch 14, Nummer 7 + Renate Aksoy = Hof 1, Tisch 14, Nummer 1 + Sarah Kuhn = Hof 1, Tisch 14, Nummer 2 + Rainer Aksoy = Hof 1, Tisch 14, Nummer 3 + Timo Kuhn = Hof 1, Tisch 14, Nummer 4 + Werner Stein = Hof 1, Tisch 14, Nummer 5 + Guenter Schwarz = Hof 1, Tisch 14, Nummer 6 + Yusuf Vogel = Hof 1, Tisch 14, Nummer 7 + Sandra Vogel = Hof 1, Tisch 14, Nummer 8 [15] - Andreas Brandt = Hof 1, Tisch 15, Nummer 1 - Anja Brandt = Hof 1, Tisch 15, Nummer 2 - Theo Brandt = Hof 1, Tisch 15, Nummer 3 - Milan Brandt = Hof 1, Tisch 15, Nummer 4 - Lena Brandt = Hof 1, Tisch 15, Nummer 5 - Heinz Tran = Hof 1, Tisch 15, Nummer 6 - Sofia Brandt = Hof 1, Tisch 15, Nummer 7 - Erika Erdem = Hof 1, Tisch 15, Nummer 8 + Jennifer Sommer = Hof 1, Tisch 15, Nummer 1 + Lina Sommer = Hof 1, Tisch 15, Nummer 2 + Milan Brandt = Hof 1, Tisch 15, Nummer 3 + Dennis Sommer = Hof 1, Tisch 15, Nummer 4 + Nicole Sommer = Hof 1, Tisch 15, Nummer 5 + Dennis Sommer = Hof 1, Tisch 15, Nummer 6 + Anja Brandt = Hof 1, Tisch 15, Nummer 7 + Sofia Brandt = Hof 1, Tisch 15, Nummer 8 [16] - Emil Sommer = Hof 1, Tisch 16, Nummer 1 - Greta Brandt = Hof 1, Tisch 16, Nummer 2 - Matteo Kraus = Hof 1, Tisch 16, Nummer 3 - Theo Sommer = Hof 1, Tisch 16, Nummer 4 - Liam Schwarz = Hof 1, Tisch 16, Nummer 5 - Max Sommer = Hof 1, Tisch 16, Nummer 6 - Frieda Brandt = Hof 1, Tisch 16, Nummer 7 - Ida Sommer = Hof 1, Tisch 16, Nummer 8 - Mila Meyer = Hof 1, Tisch 16, Nummer 9 - Leni Kuhn = Hof 1, Tisch 16, Nummer 10 - Elias Schwarz = Hof 1, Tisch 16, Nummer 11 - Felix Brandt = Hof 1, Tisch 16, Nummer 12 - Anton Brandt = Hof 1, Tisch 16, Nummer 13 + Anton Brandt = Hof 1, Tisch 16, Nummer 1 + Frieda Brandt = Hof 1, Tisch 16, Nummer 2 + Theo Sommer = Hof 1, Tisch 16, Nummer 3 + Felix Brandt = Hof 1, Tisch 16, Nummer 4 + Ida Sommer = Hof 1, Tisch 16, Nummer 5 + Liam Schwarz = Hof 1, Tisch 16, Nummer 6 + Matteo Kraus = Hof 1, Tisch 16, Nummer 7 + Greta Brandt = Hof 1, Tisch 16, Nummer 8 + Leni Kuhn = Hof 1, Tisch 16, Nummer 9 + Mila Meyer = Hof 1, Tisch 16, Nummer 10 + Emil Sommer = Hof 1, Tisch 16, Nummer 11 + Max Sommer = Hof 1, Tisch 16, Nummer 12 + Elias Schwarz = Hof 1, Tisch 16, Nummer 13 [17] - Max Vogel = Hof 1, Tisch 17, Nummer 1 - Anton Vogel = Hof 1, Tisch 17, Nummer 2 - Ida Meyer = Hof 1, Tisch 17, Nummer 3 + Anton Vogel = Hof 1, Tisch 17, Nummer 1 + Ida Meyer = Hof 1, Tisch 17, Nummer 2 + Paul Brandt = Hof 1, Tisch 17, Nummer 3 Ben Brandt = Hof 1, Tisch 17, Nummer 4 - Paul Brandt = Hof 1, Tisch 17, Nummer 5 - Anton Meyer = Hof 1, Tisch 17, Nummer 6 + Anton Meyer = Hof 1, Tisch 17, Nummer 5 + Max Vogel = Hof 1, Tisch 17, Nummer 6 diff --git a/work/hochzeit/bestellung.json b/work/hochzeit/bestellung.json new file mode 100644 index 0000000..f629693 --- /dev/null +++ b/work/hochzeit/bestellung.json @@ -0,0 +1,575 @@ +{ + "gruppen": [ + { + "name": "Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1)", + "tisch": 1, + "personen": [ + { + "vorname": "Julia", + "nachname": "Brandt" + }, + { + "vorname": "Daniel", + "nachname": "Sommer" + }, + { + "vorname": "Werner", + "nachname": "Brandt" + }, + { + "vorname": "Helga", + "nachname": "Brandt" + }, + { + "vorname": "Dieter", + "nachname": "Sommer" + }, + { + "vorname": "Renate", + "nachname": "Sommer" + }, + { + "vorname": "Sarah", + "nachname": "Winkler" + }, + { + "vorname": "Tobias", + "nachname": "Frank" + } + ] + }, + { + "name": "Familie Peters (Braut-Seite, Geschwister Melanie)", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Peters" + }, + { + "vorname": "Melanie", + "nachname": "Peters" + } + ] + }, + { + "name": "Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch", + "personen": [ + { + "vorname": "Daniel", + "nachname": "Brandt" + }, + { + "vorname": "Kathrin", + "nachname": "Brandt" + } + ] + }, + { + "name": "Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch", + "personen": [ + { + "vorname": "Dennis", + "nachname": "Kraus" + }, + { + "vorname": "Melanie", + "nachname": "Kraus" + } + ] + }, + { + "name": "Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch", + "personen": [ + { + "vorname": "Andreas", + "nachname": "Brandt" + }, + { + "vorname": "Lena", + "nachname": "Brandt" + }, + { + "vorname": "Theo", + "nachname": "Brandt" + } + ] + }, + { + "name": "Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch", + "personen": [ + { + "vorname": "Marco", + "nachname": "Meyer" + }, + { + "vorname": "Sandra", + "nachname": "Meyer" + } + ] + }, + { + "name": "Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch", + "personen": [ + { + "vorname": "Milan", + "nachname": "Brandt" + }, + { + "vorname": "Anja", + "nachname": "Brandt" + }, + { + "vorname": "Sofia", + "nachname": "Brandt" + } + ] + }, + { + "name": "Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Vogel" + }, + { + "vorname": "Sandra", + "nachname": "Vogel" + } + ] + }, + { + "name": "Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch", + "personen": [ + { + "vorname": "Dennis", + "nachname": "Sommer" + }, + { + "vorname": "Nicole", + "nachname": "Sommer" + }, + { + "vorname": "Lina", + "nachname": "Sommer" + } + ] + }, + { + "name": "Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch", + "personen": [ + { + "vorname": "Timo", + "nachname": "Kuhn" + }, + { + "vorname": "Sarah", + "nachname": "Kuhn" + } + ] + }, + { + "name": "Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch", + "personen": [ + { + "vorname": "Dennis", + "nachname": "Sommer" + }, + { + "vorname": "Jennifer", + "nachname": "Sommer" + } + ] + }, + { + "name": "Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Schwarz" + }, + { + "vorname": "Sarah", + "nachname": "Schwarz" + } + ] + }, + { + "name": "Onkel und Tante (Braut-Seite)", + "personen": [ + { + "vorname": "Horst", + "nachname": "Aydin" + }, + { + "vorname": "Ursula", + "nachname": "Aydin" + } + ] + }, + { + "name": "Onkel und Tante mit Cousine (Braut-Seite)", + "personen": [ + { + "vorname": "Ingrid", + "nachname": "Demir" + }, + { + "vorname": "Monika", + "nachname": "Demir" + }, + { + "vorname": "Hannelore", + "nachname": "Demir" + } + ] + }, + { + "name": "Onkel und Tante (Braeutigam-Seite)", + "personen": [ + { + "vorname": "Heinz", + "nachname": "Fischer" + }, + { + "vorname": "Helga", + "nachname": "Fischer" + } + ] + }, + { + "name": "Grosstante mit Begleitung", + "personen": [ + { + "vorname": "Heinz", + "nachname": "Tran" + }, + { + "vorname": "Erika", + "nachname": "Erdem" + } + ] + }, + { + "name": "Studienfreunde der Braut", + "personen": [ + { + "vorname": "Nicole", + "nachname": "Fischer" + }, + { + "vorname": "Matthias", + "nachname": "Polat" + }, + { + "vorname": "Christian", + "nachname": "Esposito" + }, + { + "vorname": "Lena", + "nachname": "Hoffmann" + }, + { + "vorname": "Timo", + "nachname": "Wagner" + }, + { + "vorname": "Nicole", + "nachname": "Dietrich" + } + ] + }, + { + "name": "Kegelclub des Brautvaters", + "personen": [ + { + "vorname": "Wolfgang", + "nachname": "Hansen" + }, + { + "vorname": "Hannelore", + "nachname": "Barth" + }, + { + "vorname": "Erika", + "nachname": "Frank" + }, + { + "vorname": "Gerhard", + "nachname": "Erdem" + }, + { + "vorname": "Rainer", + "nachname": "Erdem" + }, + { + "vorname": "Gisela", + "nachname": "Esposito" + }, + { + "vorname": "Brigitte", + "nachname": "Franke" + }, + { + "vorname": "Wolfgang", + "nachname": "Meyer" + } + ] + }, + { + "name": "Arbeitskolleginnen der Braut", + "personen": [ + { + "vorname": "Elif", + "nachname": "Demir" + }, + { + "vorname": "Jennifer", + "nachname": "Simon" + }, + { + "vorname": "Andreas", + "nachname": "Stein" + }, + { + "vorname": "Stefan", + "nachname": "Klein" + }, + { + "vorname": "Timo", + "nachname": "Frank" + }, + { + "vorname": "Daniel", + "nachname": "Wagner" + }, + { + "vorname": "Stefanie", + "nachname": "Simon" + } + ] + }, + { + "name": "Arbeitskollegen des Braeutigams", + "personen": [ + { + "vorname": "Nadine", + "nachname": "Frank" + }, + { + "vorname": "Markus", + "nachname": "Schmitt" + }, + { + "vorname": "Olga", + "nachname": "Yilmaz" + }, + { + "vorname": "Olga", + "nachname": "Hansen" + }, + { + "vorname": "Daniel", + "nachname": "Horn" + }, + { + "vorname": "Milan", + "nachname": "Lange" + } + ] + }, + { + "name": "Nachbarn der Brauteltern", + "personen": [ + { + "vorname": "Guenter", + "nachname": "Schwarz" + }, + { + "vorname": "Rainer", + "nachname": "Aksoy" + }, + { + "vorname": "Renate", + "nachname": "Aksoy" + }, + { + "vorname": "Werner", + "nachname": "Stein" + } + ] + }, + { + "name": "Fussballverein des Braeutigams", + "personen": [ + { + "vorname": "Sergej", + "nachname": "Berger" + }, + { + "vorname": "Giovanna", + "nachname": "Kovac" + }, + { + "vorname": "Dennis", + "nachname": "Schmidt" + }, + { + "vorname": "Patrick", + "nachname": "Simon" + }, + { + "vorname": "Stefanie", + "nachname": "Busch" + }, + { + "vorname": "Andreas", + "nachname": "Koch" + }, + { + "vorname": "Svenja", + "nachname": "Vogel" + }, + { + "vorname": "Giovanna", + "nachname": "Koch" + }, + { + "vorname": "Julia", + "nachname": "Esposito" + } + ] + }, + { + "name": "Freundinnen aus der Schulzeit", + "personen": [ + { + "vorname": "Jennifer", + "nachname": "Dietrich" + }, + { + "vorname": "Christian", + "nachname": "Meyer" + }, + { + "vorname": "Svenja", + "nachname": "Horn" + }, + { + "vorname": "Stefanie", + "nachname": "Roth" + }, + { + "vorname": "Stefan", + "nachname": "Kuhn" + } + ] + }, + { + "name": "Kindertisch (5-12 Jahre, fest an Tisch 16)", + "tisch": 16, + "personen": [ + { + "vorname": "Felix", + "nachname": "Brandt" + }, + { + "vorname": "Matteo", + "nachname": "Kraus" + }, + { + "vorname": "Anton", + "nachname": "Brandt" + }, + { + "vorname": "Frieda", + "nachname": "Brandt" + }, + { + "vorname": "Mila", + "nachname": "Meyer" + }, + { + "vorname": "Greta", + "nachname": "Brandt" + }, + { + "vorname": "Theo", + "nachname": "Sommer" + }, + { + "vorname": "Max", + "nachname": "Sommer" + }, + { + "vorname": "Leni", + "nachname": "Kuhn" + }, + { + "vorname": "Emil", + "nachname": "Sommer" + }, + { + "vorname": "Ida", + "nachname": "Sommer" + }, + { + "vorname": "Liam", + "nachname": "Schwarz" + }, + { + "vorname": "Elias", + "nachname": "Schwarz" + } + ] + }, + { + "name": "Teenager-Tisch (13-19 Jahre, fest an Tisch 17)", + "tisch": 17, + "personen": [ + { + "vorname": "Ben", + "nachname": "Brandt" + }, + { + "vorname": "Paul", + "nachname": "Brandt" + }, + { + "vorname": "Anton", + "nachname": "Meyer" + }, + { + "vorname": "Ida", + "nachname": "Meyer" + }, + { + "vorname": "Anton", + "nachname": "Vogel" + }, + { + "vorname": "Max", + "nachname": "Vogel" + } + ] + }, + { + "name": "Musikverein (anonyme Sammelbuchung, 13 Karten)", + "anzahl": 13, + "personen": [ + { + "vorname": "Gast", + "nachname": "Musikverein" + } + ] + }, + { + "name": "alleinreisender Gast", + "personen": [ + { + "vorname": "Sven", + "nachname": "Fischer" + } + ] + } + ] +} \ No newline at end of file diff --git a/work/hochzeit/bestellung.xml b/work/hochzeit/bestellung.xml deleted file mode 100644 index 79cd907..0000000 --- a/work/hochzeit/bestellung.xml +++ /dev/null @@ -1,549 +0,0 @@ - - - - - - - - Julia - Brandt - - - Daniel - Sommer - - - Werner - Brandt - - - Helga - Brandt - - - Dieter - Sommer - - - Renate - Sommer - - - Sarah - Winkler - - - Tobias - Frank - - 1 - - - - - - Yusuf - Peters - - - Melanie - Peters - - - - - - - Daniel - Brandt - - - Kathrin - Brandt - - - - - - - Dennis - Kraus - - - Melanie - Kraus - - - - - - - Andreas - Brandt - - - Lena - Brandt - - - Theo - Brandt - - - - - - - Marco - Meyer - - - Sandra - Meyer - - - - - - - Milan - Brandt - - - Anja - Brandt - - - Sofia - Brandt - - - - - - - Yusuf - Vogel - - - Sandra - Vogel - - - - - - - Dennis - Sommer - - - Nicole - Sommer - - - Lina - Sommer - - - - - - - Timo - Kuhn - - - Sarah - Kuhn - - - - - - - Dennis - Sommer - - - Jennifer - Sommer - - - - - - - Yusuf - Schwarz - - - Sarah - Schwarz - - - - - - - Horst - Aydin - - - Ursula - Aydin - - - - - - - Ingrid - Demir - - - Monika - Demir - - - Hannelore - Demir - - - - - - - Heinz - Fischer - - - Helga - Fischer - - - - - - - Heinz - Tran - - - Erika - Erdem - - - - - - - Nicole - Fischer - - - Matthias - Polat - - - Christian - Esposito - - - Lena - Hoffmann - - - Timo - Wagner - - - Nicole - Dietrich - - - - - - - Wolfgang - Hansen - - - Hannelore - Barth - - - Erika - Frank - - - Gerhard - Erdem - - - Rainer - Erdem - - - Gisela - Esposito - - - Brigitte - Franke - - - Wolfgang - Meyer - - - - - - - Elif - Demir - - - Jennifer - Simon - - - Andreas - Stein - - - Stefan - Klein - - - Timo - Frank - - - Daniel - Wagner - - - Stefanie - Simon - - - - - - - Nadine - Frank - - - Markus - Schmitt - - - Olga - Yilmaz - - - Olga - Hansen - - - Daniel - Horn - - - Milan - Lange - - - - - - - Guenter - Schwarz - - - Rainer - Aksoy - - - Renate - Aksoy - - - Werner - Stein - - - - - - - Sergej - Berger - - - Giovanna - Kovac - - - Dennis - Schmidt - - - Patrick - Simon - - - Stefanie - Busch - - - Andreas - Koch - - - Svenja - Vogel - - - Giovanna - Koch - - - Julia - Esposito - - - - - - - Jennifer - Dietrich - - - Christian - Meyer - - - Svenja - Horn - - - Stefanie - Roth - - - Stefan - Kuhn - - - - - - - Felix - Brandt - - - Matteo - Kraus - - - Anton - Brandt - - - Frieda - Brandt - - - Mila - Meyer - - - Greta - Brandt - - - Theo - Sommer - - - Max - Sommer - - - Leni - Kuhn - - - Emil - Sommer - - - Ida - Sommer - - - Liam - Schwarz - - - Elias - Schwarz - - 16 - - - - - - Ben - Brandt - - - Paul - Brandt - - - Anton - Meyer - - - Ida - Meyer - - - Anton - Vogel - - - Max - Vogel - - 17 - - - - - - Gast - Musikverein - - 13 - - - - - - Sven - Fischer - - - - diff --git a/work/innenhoefe/Entwicklung.svg b/work/innenhoefe/Entwicklung.svg new file mode 100644 index 0000000..d22d98f --- /dev/null +++ b/work/innenhoefe/Entwicklung.svg @@ -0,0 +1,47 @@ + + + +Entwicklung der Loesungsfindung + + + +-620 + +-559 + +-498 + +-436 + +-375 + +-314 +Wertigkeit (hoeher = besser) +Zyklus-Aktion (Zeit) +e +s +z +m +j +z +s +z +m +j +z +s +z +m +j +z +s + + + + +beste Loesung + +Durchschnitt + +schlechteste Loesung + diff --git a/work/innenhoefe/PersonenTische.csv b/work/innenhoefe/PersonenTische.csv index 588d148..31dc9da 100644 --- a/work/innenhoefe/PersonenTische.csv +++ b/work/innenhoefe/PersonenTische.csv @@ -1,300 +1,300 @@ -Aksoy, Luca, = Hof 1, Tisch 14, Nummer 3 -Aksoy, Marie, = Hof 1, Tisch 24, Nummer 5 -Aksoy, Marija, = Hof 2, Tisch 54, Nummer 5 -Aksoy, Michael, Dr. = Hof 2, Tisch 59, Nummer 4 -Aksoy, Nadine, = Hof 1, Tisch 14, Nummer 4 -Aksoy, Nicole, = Hof 1, Tisch 38, Nummer 5 -Aksoy, Sergej, = Hof 1, Tisch 14, Nummer 2 -Aksoy, Sofia, = Hof 1, Tisch 14, Nummer 5 -Aksoy, Thomas, = Hof 1, Tisch 24, Nummer 2 -Albrecht, Andreas, = Hof 1, Tisch 17, Nummer 5 -Albrecht, Emre, Prof. Dr. = Hof 2, Tisch 67, Nummer 2 -Albrecht, Sarah, = Hof 1, Tisch 17, Nummer 2 -Albrecht, Yusuf, Prof. Dr. = Hof 1, Tisch 18, Nummer 3 -Arnold, Christian, = Hof 2, Tisch 52, Nummer 3 -Arnold, Jennifer, = Hof 2, Tisch 53, Nummer 5 -Arnold, Jennifer, Dr. = Hof 2, Tisch 67, Nummer 4 -Arnold, Leni, = Hof 2, Tisch 52, Nummer 4 -Arnold, Mila, = Hof 2, Tisch 52, Nummer 2 -Arnold, Nadine, = Hof 1, Tisch 40, Nummer 4 -Arnold, Patrick, = Hof 2, Tisch 53, Nummer 4 -Barth, Lina, = Hof 2, Tisch 66, Nummer 5 -Barth, Markus, = Hof 1, Tisch 45, Nummer 2 -Barth, Nadine, = Hof 2, Tisch 66, Nummer 3 -Barth, Patrick, = Hof 2, Tisch 66, Nummer 2 -Barth, Timo, = Hof 2, Tisch 66, Nummer 4 -Bauer, Dragana, = Hof 1, Tisch 42, Nummer 2 -Bauer, Yusuf, = Hof 1, Tisch 2, Nummer 3 -Becker, Jan, = Hof 2, Tisch 50, Nummer 2 -Becker, Marija, = Hof 1, Tisch 26, Nummer 2 -Becker, Nicole, = Hof 2, Tisch 50, Nummer 4 -Becker, Sandra, = Hof 2, Tisch 50, Nummer 3 -Berger, Andreas, = Hof 1, Tisch 33, Nummer 2 -Berger, Anton, = Hof 1, Tisch 25, Nummer 2 -Berger, Jennifer, = Hof 1, Tisch 25, Nummer 3 -Berger, Layla, = Hof 1, Tisch 25, Nummer 4 -Berger, Nadine, Dr. = Hof 2, Tisch 77, Nummer 2 -Berger, Stefan, = Hof 1, Tisch 33, Nummer 4 -Berger, Svenja, = Hof 1, Tisch 33, Nummer 3 -Bianchi, Jan, Dr. = Hof 1, Tisch 1, Nummer 4 -Bianchi, Mia, = Hof 1, Tisch 21, Nummer 2 -Bianchi, Sandra, = Hof 1, Tisch 21, Nummer 3 -Bianchi, Thomas, = Hof 1, Tisch 21, Nummer 4 -Bianchi, Thomas, = Hof 2, Tisch 67, Nummer 5 -Braun, Christian, = Hof 1, Tisch 37, Nummer 2 -Braun, Dragana, = Hof 1, Tisch 36, Nummer 5 -Braun, Jan, = Hof 1, Tisch 36, Nummer 2 -Braun, Julia, = Hof 1, Tisch 37, Nummer 3 -Braun, Milan, = Hof 1, Tisch 37, Nummer 5 -Braun, Nadine, = Hof 1, Tisch 37, Nummer 4 -Busch, Emre, = Hof 1, Tisch 28, Nummer 2 -Busch, Marie, = Hof 1, Tisch 28, Nummer 5 -Busch, Michael, = Hof 1, Tisch 28, Nummer 4 -Busch, Olga, = Hof 1, Tisch 28, Nummer 3 -Busch, Patrick, = Hof 2, Tisch 49, Nummer 2 -Celik, Elif, = Hof 1, Tisch 19, Nummer 5 -Celik, Patrick, = Hof 1, Tisch 19, Nummer 4 -Dallmann, Charlotte, = Hof 1, Tisch 7, Nummer 5 +Aksoy, Luca, = Hof 1, Tisch 32, Nummer 5 +Aksoy, Marie, = Hof 1, Tisch 33, Nummer 4 +Aksoy, Marija, = Hof 1, Tisch 31, Nummer 2 +Aksoy, Michael, Dr. = Hof 2, Tisch 64, Nummer 5 +Aksoy, Nadine, = Hof 1, Tisch 32, Nummer 4 +Aksoy, Nicole, = Hof 1, Tisch 24, Nummer 5 +Aksoy, Sergej, = Hof 1, Tisch 32, Nummer 2 +Aksoy, Sofia, = Hof 1, Tisch 32, Nummer 3 +Aksoy, Thomas, = Hof 1, Tisch 33, Nummer 5 +Albrecht, Andreas, = Hof 1, Tisch 20, Nummer 4 +Albrecht, Emre, Prof. Dr. = Hof 2, Tisch 57, Nummer 2 +Albrecht, Sarah, = Hof 1, Tisch 20, Nummer 2 +Albrecht, Yusuf, Prof. Dr. = Hof 1, Tisch 28, Nummer 3 +Arnold, Christian, = Hof 2, Tisch 47, Nummer 2 +Arnold, Jennifer, = Hof 2, Tisch 47, Nummer 4 +Arnold, Jennifer, Dr. = Hof 2, Tisch 57, Nummer 3 +Arnold, Leni, = Hof 1, Tisch 20, Nummer 3 +Arnold, Mila, = Hof 2, Tisch 47, Nummer 3 +Arnold, Nadine, = Hof 1, Tisch 30, Nummer 2 +Arnold, Patrick, = Hof 1, Tisch 20, Nummer 5 +Barth, Lina, = Hof 2, Tisch 83, Nummer 2 +Barth, Markus, = Hof 2, Tisch 68, Nummer 4 +Barth, Nadine, = Hof 2, Tisch 83, Nummer 3 +Barth, Patrick, = Hof 2, Tisch 83, Nummer 5 +Barth, Timo, = Hof 2, Tisch 83, Nummer 4 +Bauer, Dragana, = Hof 1, Tisch 44, Nummer 3 +Bauer, Yusuf, = Hof 1, Tisch 3, Nummer 5 +Becker, Jan, = Hof 2, Tisch 61, Nummer 2 +Becker, Marija, = Hof 2, Tisch 55, Nummer 2 +Becker, Nicole, = Hof 2, Tisch 61, Nummer 4 +Becker, Sandra, = Hof 2, Tisch 61, Nummer 3 +Berger, Andreas, = Hof 1, Tisch 18, Nummer 2 +Berger, Anton, = Hof 1, Tisch 18, Nummer 4 +Berger, Jennifer, = Hof 1, Tisch 18, Nummer 3 +Berger, Layla, = Hof 1, Tisch 17, Nummer 2 +Berger, Nadine, Dr. = Hof 2, Tisch 81, Nummer 2 +Berger, Stefan, = Hof 1, Tisch 17, Nummer 4 +Berger, Svenja, = Hof 1, Tisch 17, Nummer 3 +Bianchi, Jan, Dr. = Hof 1, Tisch 4, Nummer 2 +Bianchi, Mia, = Hof 2, Tisch 50, Nummer 4 +Bianchi, Sandra, = Hof 2, Tisch 50, Nummer 3 +Bianchi, Thomas, = Hof 2, Tisch 50, Nummer 2 +Bianchi, Thomas, = Hof 2, Tisch 58, Nummer 5 +Braun, Christian, = Hof 1, Tisch 41, Nummer 3 +Braun, Dragana, = Hof 1, Tisch 40, Nummer 4 +Braun, Jan, = Hof 1, Tisch 40, Nummer 3 +Braun, Julia, = Hof 1, Tisch 41, Nummer 4 +Braun, Milan, = Hof 1, Tisch 41, Nummer 2 +Braun, Nadine, = Hof 1, Tisch 40, Nummer 2 +Busch, Emre, = Hof 1, Tisch 22, Nummer 4 +Busch, Marie, = Hof 1, Tisch 22, Nummer 5 +Busch, Michael, = Hof 1, Tisch 22, Nummer 2 +Busch, Olga, = Hof 1, Tisch 22, Nummer 3 +Busch, Patrick, = Hof 2, Tisch 54, Nummer 3 +Celik, Elif, = Hof 1, Tisch 33, Nummer 2 +Celik, Patrick, = Hof 1, Tisch 33, Nummer 3 +Dallmann, Charlotte, = Hof 1, Tisch 7, Nummer 2 Dallmann, Heinrich, = Hof 1, Tisch 7, Nummer 4 -Dallmann, Margarete, = Hof 1, Tisch 7, Nummer 3 -Dallmann, Maximilian, = Hof 1, Tisch 7, Nummer 2 -Demir, Sandra, Dr. = Hof 1, Tisch 19, Nummer 2 -Dietrich, Dragana, Prof. Dr. = Hof 2, Tisch 59, Nummer 5 -Dietrich, Jennifer, = Hof 2, Tisch 78, Nummer 2 -Dietrich, Marco, = Hof 2, Tisch 78, Nummer 3 -Dietrich, Sofia, = Hof 2, Tisch 78, Nummer 4 -Engel, Anja, = Hof 1, Tisch 10, Nummer 4 -Engel, Anton, = Hof 1, Tisch 11, Nummer 4 -Engel, Julia, = Hof 1, Tisch 11, Nummer 2 -Engel, Nicole, = Hof 1, Tisch 11, Nummer 3 -Engel, Yusuf, = Hof 1, Tisch 10, Nummer 2 -Esposito, Jan, Dr. = Hof 1, Tisch 12, Nummer 3 -Esposito, Yusuf, Prof. Dr. = Hof 1, Tisch 26, Nummer 3 -Frank, Dennis, = Hof 1, Tisch 10, Nummer 5 -Frank, Finn, = Hof 1, Tisch 9, Nummer 4 -Frank, Lena, = Hof 1, Tisch 9, Nummer 3 -Frank, Marie, = Hof 1, Tisch 10, Nummer 3 -Frank, Nadine, = Hof 1, Tisch 9, Nummer 2 -Franke, Amira, = Hof 2, Tisch 73, Nummer 3 -Franke, Julia, = Hof 2, Tisch 81, Nummer 2 -Franke, Marco, = Hof 2, Tisch 81, Nummer 3 -Franke, Michael, = Hof 2, Tisch 73, Nummer 2 -Franke, Olga, = Hof 2, Tisch 81, Nummer 4 -Freifrau von Waldeck, Antonia, = Hof 1, Tisch 6, Nummer 4 -Freiherr von Waldeck, Konstantin, Dr. = Hof 1, Tisch 6, Nummer 2 -Grothe, Alexander, Dr. h.c. = Hof 1, Tisch 5, Nummer 5 -Grothe, Beate, = Hof 1, Tisch 5, Nummer 2 -Haas, Jennifer, Dr. = Hof 1, Tisch 45, Nummer 4 -Haas, Patrick, = Hof 1, Tisch 42, Nummer 4 -Hansen, Giovanna, = Hof 1, Tisch 30, Nummer 4 -Hansen, Markus, = Hof 1, Tisch 30, Nummer 3 -Hansen, Nicole, Dr. = Hof 1, Tisch 42, Nummer 3 -Hansen, Olga, = Hof 1, Tisch 30, Nummer 2 -Hansen, Thomas, = Hof 1, Tisch 12, Nummer 5 -Hartmann, Deniz, = Hof 2, Tisch 85, Nummer 4 -Hartmann, Marija, = Hof 2, Tisch 86, Nummer 3 -Hartmann, Nadine, = Hof 2, Tisch 86, Nummer 2 -Hartmann, Olga, = Hof 2, Tisch 85, Nummer 3 -Hartmann, Thomas, = Hof 2, Tisch 85, Nummer 2 -Hoffmann, Emre, = Hof 2, Tisch 49, Nummer 3 -Hoffmann, Patrick, Prof. Dr. = Hof 1, Tisch 40, Nummer 5 -Hoffmann, Thomas, Dr. = Hof 1, Tisch 32, Nummer 4 -Horn, Kathrin, = Hof 2, Tisch 84, Nummer 4 -Horn, Layla, = Hof 2, Tisch 84, Nummer 3 -Horn, Leon, = Hof 2, Tisch 84, Nummer 5 -Horn, Michael, = Hof 2, Tisch 84, Nummer 2 -Kaya, Christina, = Hof 1, Tisch 43, Nummer 4 -Kaya, Luca, = Hof 1, Tisch 43, Nummer 3 -Kaya, Nicole, = Hof 1, Tisch 43, Nummer 2 -Kaya, Patrick, Dr. = Hof 1, Tisch 1, Nummer 2 -Kaya, Timo, Prof. Dr. = Hof 1, Tisch 19, Nummer 3 -Kessler, Ferdinand, Dr. = Hof 1, Tisch 5, Nummer 4 -Kessler, Viktoria, = Hof 1, Tisch 5, Nummer 3 -Klein, Emre, = Hof 1, Tisch 2, Nummer 4 -Klein, Lina, = Hof 2, Tisch 63, Nummer 4 -Klein, Markus, = Hof 1, Tisch 38, Nummer 4 -Klein, Milan, = Hof 2, Tisch 63, Nummer 2 -Klein, Olga, Dr. = Hof 2, Tisch 57, Nummer 2 -Klein, Stefanie, = Hof 2, Tisch 63, Nummer 3 -Koch, Emil, = Hof 2, Tisch 48, Nummer 2 -Koch, Jan, = Hof 2, Tisch 48, Nummer 5 -Koch, Kathrin, Dr. = Hof 2, Tisch 68, Nummer 3 -Koch, Marie, = Hof 2, Tisch 48, Nummer 3 -Koch, Michael, = Hof 2, Tisch 49, Nummer 4 -Koch, Olga, = Hof 2, Tisch 48, Nummer 4 -Koch, Sarah, = Hof 2, Tisch 49, Nummer 5 -Kovac, Anja, = Hof 1, Tisch 15, Nummer 3 -Kovac, Henry, = Hof 1, Tisch 15, Nummer 2 -Kovac, Lena, = Hof 1, Tisch 15, Nummer 4 -Kovac, Luca, = Hof 2, Tisch 71, Nummer 2 -Kovac, Marco, = Hof 1, Tisch 15, Nummer 5 -Kovac, Marija, = Hof 1, Tisch 24, Nummer 4 -Kovac, Matthias, = Hof 1, Tisch 26, Nummer 4 -Kovac, Tobias, = Hof 1, Tisch 24, Nummer 3 -Kraus, Markus, = Hof 1, Tisch 3, Nummer 5 -Kraus, Patrick, Dr. = Hof 2, Tisch 57, Nummer 5 -Krause, Andreas, = Hof 2, Tisch 74, Nummer 5 -Krause, Arda, = Hof 2, Tisch 74, Nummer 4 -Krause, Christina, Dr. = Hof 1, Tisch 1, Nummer 3 -Krause, Daniel, = Hof 1, Tisch 38, Nummer 3 -Krause, Dragana, Dr. = Hof 2, Tisch 71, Nummer 3 -Krause, Emma, = Hof 2, Tisch 74, Nummer 2 -Krause, Julia, = Hof 2, Tisch 74, Nummer 3 -Krause, Matthias, = Hof 2, Tisch 58, Nummer 4 -Krause, Thomas, = Hof 1, Tisch 41, Nummer 2 -Kuhn, Julia, Dr. = Hof 2, Tisch 68, Nummer 4 -Lange, Dragana, = Hof 2, Tisch 72, Nummer 2 -Lange, Jan, = Hof 2, Tisch 73, Nummer 5 -Lange, Michael, = Hof 2, Tisch 72, Nummer 3 -Lange, Sergej, = Hof 2, Tisch 59, Nummer 3 -Lange, Sofia, = Hof 2, Tisch 72, Nummer 4 -Lange, Svenja, = Hof 2, Tisch 73, Nummer 4 -Lehmann, Giovanna, = Hof 1, Tisch 16, Nummer 2 -Lehmann, Layla, = Hof 1, Tisch 16, Nummer 5 -Lehmann, Markus, = Hof 1, Tisch 16, Nummer 4 -Lehmann, Milan, = Hof 1, Tisch 16, Nummer 3 -Lehmann, Nicole, = Hof 1, Tisch 17, Nummer 3 -Lehmann, Patrick, = Hof 2, Tisch 77, Nummer 4 -Lehmann, Thomas, = Hof 1, Tisch 17, Nummer 4 -Ludwig, Aylin, Dr. = Hof 2, Tisch 57, Nummer 4 -Ludwig, Elias, = Hof 2, Tisch 56, Nummer 3 -Ludwig, Elif, = Hof 2, Tisch 56, Nummer 4 -Ludwig, Emre, = Hof 2, Tisch 56, Nummer 2 -Ludwig, Emre, Prof. Dr. = Hof 1, Tisch 38, Nummer 2 -Ludwig, Giovanna, = Hof 2, Tisch 56, Nummer 5 -Maier, Arda, = Hof 2, Tisch 60, Nummer 2 -Maier, Christian, = Hof 2, Tisch 60, Nummer 4 -Maier, Olga, = Hof 2, Tisch 60, Nummer 3 -Maier, Sarah, = Hof 2, Tisch 60, Nummer 5 -Neumann, Jennifer, = Hof 2, Tisch 83, Nummer 4 -Neumann, Lina, = Hof 2, Tisch 83, Nummer 3 -Neumann, Matteo, = Hof 2, Tisch 83, Nummer 2 -Neumann, Thomas, = Hof 2, Tisch 83, Nummer 5 -Nguyen, Anja, = Hof 2, Tisch 51, Nummer 3 -Nguyen, Daniel, = Hof 2, Tisch 51, Nummer 4 -Nguyen, Julia, = Hof 1, Tisch 13, Nummer 4 -Nguyen, Sofia, = Hof 2, Tisch 51, Nummer 2 -Nowak, Aylin, = Hof 1, Tisch 36, Nummer 3 -Nowak, Felix, = Hof 1, Tisch 35, Nummer 2 -Nowak, Kathrin, = Hof 1, Tisch 36, Nummer 4 -Nowak, Lina, = Hof 1, Tisch 35, Nummer 4 -Nowak, Markus, = Hof 1, Tisch 35, Nummer 5 -Nowak, Noah, = Hof 1, Tisch 35, Nummer 3 -Ott, Daniel, = Hof 2, Tisch 86, Nummer 5 -Ott, Hannah, = Hof 2, Tisch 80, Nummer 3 -Ott, Luca, = Hof 2, Tisch 71, Nummer 4 -Ott, Matthias, = Hof 2, Tisch 80, Nummer 2 -Ott, Melanie, = Hof 2, Tisch 80, Nummer 4 -Ott, Olga, = Hof 2, Tisch 86, Nummer 4 -Ott, Sergej, Prof. Dr. = Hof 1, Tisch 42, Nummer 5 -Ott, Yusuf, Prof. Dr. = Hof 2, Tisch 77, Nummer 3 -Peters, Christian, = Hof 1, Tisch 3, Nummer 4 -Peters, Nicole, = Hof 1, Tisch 41, Nummer 3 -Petrov, Giovanna, = Hof 1, Tisch 3, Nummer 3 -Petrov, Kathrin, = Hof 1, Tisch 20, Nummer 4 -Petrov, Kathrin, Prof. Dr. = Hof 1, Tisch 4, Nummer 2 -Petrov, Matthias, = Hof 1, Tisch 45, Nummer 5 -Petrov, Milan, = Hof 1, Tisch 20, Nummer 5 -Petrov, Sergej, = Hof 2, Tisch 54, Nummer 3 -Pohl, Dragana, = Hof 2, Tisch 75, Nummer 4 -Pohl, Emre, = Hof 2, Tisch 75, Nummer 5 -Pohl, Mia, = Hof 2, Tisch 75, Nummer 2 -Pohl, Theo, = Hof 2, Tisch 75, Nummer 3 -Polat, Kathrin, = Hof 2, Tisch 54, Nummer 2 -Polat, Katrin, = Hof 2, Tisch 88, Nummer 3 -Polat, Marija, = Hof 1, Tisch 40, Nummer 2 -Polat, Markus, = Hof 2, Tisch 88, Nummer 2 -Polat, Sarah, = Hof 2, Tisch 53, Nummer 2 -Polat, Stefan, = Hof 2, Tisch 53, Nummer 3 -Polat, Stefanie, = Hof 2, Tisch 88, Nummer 4 -Popescu, Matthias, = Hof 1, Tisch 18, Nummer 5 -Richter, Anja, = Hof 1, Tisch 31, Nummer 5 -Richter, Anja, Prof. Dr. = Hof 2, Tisch 65, Nummer 3 -Richter, Anton, = Hof 1, Tisch 31, Nummer 4 -Richter, Greta, = Hof 1, Tisch 31, Nummer 3 -Richter, Julia, Prof. Dr. = Hof 1, Tisch 45, Nummer 3 -Richter, Marco, = Hof 1, Tisch 40, Nummer 3 -Richter, Matthias, = Hof 1, Tisch 31, Nummer 2 -Richter, Stefan, = Hof 2, Tisch 62, Nummer 3 -Rossi, Emilia, = Hof 1, Tisch 29, Nummer 4 -Rossi, Luca, = Hof 1, Tisch 29, Nummer 3 -Rossi, Melanie, = Hof 1, Tisch 29, Nummer 2 -Roth, Christian, = Hof 2, Tisch 64, Nummer 3 -Roth, Julia, Prof. Dr. = Hof 1, Tisch 13, Nummer 3 -Roth, Olga, = Hof 2, Tisch 67, Nummer 3 -Roth, Sarah, = Hof 2, Tisch 64, Nummer 2 -Roth, Sofia, = Hof 2, Tisch 64, Nummer 4 -Sahin, Kathrin, = Hof 2, Tisch 55, Nummer 2 -Sahin, Markus, = Hof 2, Tisch 55, Nummer 4 -Sahin, Nicole, = Hof 2, Tisch 55, Nummer 5 -Sahin, Patrick, = Hof 2, Tisch 55, Nummer 3 -Sahin, Thomas, = Hof 2, Tisch 65, Nummer 2 -Schmidt, Giovanna, = Hof 1, Tisch 44, Nummer 3 -Schmidt, Marie, = Hof 1, Tisch 44, Nummer 2 -Schmidt, Matthias, = Hof 1, Tisch 44, Nummer 5 -Schmidt, Nicole, = Hof 1, Tisch 12, Nummer 4 -Schmitt, Dennis, Prof. Dr. = Hof 2, Tisch 62, Nummer 4 -Schmitt, Markus, = Hof 1, Tisch 22, Nummer 5 -Schmitt, Markus, = Hof 1, Tisch 4, Nummer 3 -Schmitt, Sarah, = Hof 1, Tisch 22, Nummer 4 -Schmitt, Sofia, = Hof 1, Tisch 22, Nummer 2 -Schmitt, Stefan, Prof. Dr. = Hof 2, Tisch 69, Nummer 4 -Schwarz, Giovanna, = Hof 2, Tisch 58, Nummer 3 -Seidel, Anja, Dr. = Hof 1, Tisch 32, Nummer 5 -Seidel, Markus, Dr. = Hof 1, Tisch 3, Nummer 2 -Seidel, Yusuf, Prof. Dr. = Hof 1, Tisch 2, Nummer 5 -Seifert, Elif, = Hof 1, Tisch 23, Nummer 4 -Seifert, Leni, = Hof 1, Tisch 23, Nummer 3 -Seifert, Marco, Prof. Dr. = Hof 2, Tisch 57, Nummer 3 -Seifert, Nicole, = Hof 1, Tisch 22, Nummer 3 -Seifert, Stefanie, Dr. = Hof 1, Tisch 13, Nummer 2 -Seifert, Timo, = Hof 1, Tisch 23, Nummer 5 -Seifert, Yusuf, = Hof 1, Tisch 23, Nummer 2 -Simon, Andreas, = Hof 2, Tisch 61, Nummer 2 -Simon, Emma, = Hof 2, Tisch 61, Nummer 4 -Simon, Lena, = Hof 2, Tisch 61, Nummer 5 -Simon, Markus, = Hof 2, Tisch 61, Nummer 3 -Simon, Svenja, = Hof 1, Tisch 18, Nummer 2 -Stein, Ben, = Hof 2, Tisch 76, Nummer 5 -Stein, Emilia, = Hof 2, Tisch 76, Nummer 4 -Stein, Giovanna, = Hof 2, Tisch 76, Nummer 2 -Stein, Markus, Prof. Dr. = Hof 1, Tisch 18, Nummer 4 -Stein, Nadine, Dr. = Hof 1, Tisch 4, Nummer 4 -Stein, Thomas, = Hof 2, Tisch 76, Nummer 3 -Steinbach, Elisabeth, = Hof 1, Tisch 6, Nummer 3 -Steinbach, Georg, = Hof 1, Tisch 6, Nummer 5 -Thiel, Christina, = Hof 2, Tisch 82, Nummer 2 -Thiel, Jan, Dr. = Hof 2, Tisch 65, Nummer 4 -Thiel, Julia, = Hof 2, Tisch 82, Nummer 3 -Thiel, Yusuf, = Hof 2, Tisch 82, Nummer 4 -Tran, Marija, = Hof 2, Tisch 69, Nummer 2 -Tran, Olga, = Hof 1, Tisch 32, Nummer 2 -Tran, Thomas, Prof. Dr. = Hof 2, Tisch 54, Nummer 4 -Wagner, Henry, = Hof 2, Tisch 46, Nummer 3 -Wagner, Marco, = Hof 2, Tisch 46, Nummer 5 -Wagner, Nicole, = Hof 2, Tisch 46, Nummer 4 -Wagner, Sarah, = Hof 2, Tisch 46, Nummer 2 -Weber, Andreas, = Hof 1, Tisch 44, Nummer 4 -Weber, Julia, = Hof 1, Tisch 2, Nummer 2 -Weber, Katrin, = Hof 2, Tisch 68, Nummer 2 -Weber, Yusuf, = Hof 2, Tisch 58, Nummer 2 -Werner, Andreas, = Hof 1, Tisch 39, Nummer 4 -Werner, Dennis, Prof. Dr. = Hof 1, Tisch 32, Nummer 3 -Werner, Katrin, = Hof 2, Tisch 59, Nummer 2 -Werner, Luca, = Hof 2, Tisch 69, Nummer 3 -Werner, Marco, = Hof 1, Tisch 39, Nummer 3 -Werner, Nadine, = Hof 1, Tisch 39, Nummer 5 -Werner, Sandra, = Hof 1, Tisch 39, Nummer 2 -Winkler, Lena, = Hof 1, Tisch 20, Nummer 2 -Winkler, Marco, = Hof 1, Tisch 1, Nummer 5 -Winkler, Patrick, = Hof 1, Tisch 20, Nummer 3 -Winkler, Thomas, = Hof 1, Tisch 12, Nummer 2 -Wolf, Ben, = Hof 2, Tisch 79, Nummer 5 -Wolf, Emma, = Hof 2, Tisch 79, Nummer 4 -Wolf, Julia, = Hof 2, Tisch 79, Nummer 3 -Wolf, Thomas, = Hof 2, Tisch 79, Nummer 2 -Zimmermann, Jan, = Hof 2, Tisch 70, Nummer 2 -Zimmermann, Markus, = Hof 2, Tisch 70, Nummer 3 -Zimmermann, Mia, = Hof 2, Tisch 70, Nummer 4 -Zimmermann, Patrick, = Hof 2, Tisch 62, Nummer 2 -Zimmermann, Svenja, = Hof 2, Tisch 70, Nummer 5 +Dallmann, Margarete, = Hof 1, Tisch 7, Nummer 5 +Dallmann, Maximilian, = Hof 1, Tisch 7, Nummer 3 +Demir, Sandra, Dr. = Hof 1, Tisch 45, Nummer 5 +Dietrich, Dragana, Prof. Dr. = Hof 2, Tisch 54, Nummer 4 +Dietrich, Jennifer, = Hof 2, Tisch 85, Nummer 4 +Dietrich, Marco, = Hof 2, Tisch 85, Nummer 3 +Dietrich, Sofia, = Hof 2, Tisch 85, Nummer 2 +Engel, Anja, = Hof 2, Tisch 58, Nummer 3 +Engel, Anton, = Hof 2, Tisch 48, Nummer 3 +Engel, Julia, = Hof 2, Tisch 48, Nummer 4 +Engel, Nicole, = Hof 2, Tisch 48, Nummer 2 +Engel, Yusuf, = Hof 2, Tisch 58, Nummer 2 +Esposito, Jan, Dr. = Hof 1, Tisch 16, Nummer 2 +Esposito, Yusuf, Prof. Dr. = Hof 2, Tisch 55, Nummer 4 +Frank, Dennis, = Hof 1, Tisch 26, Nummer 3 +Frank, Finn, = Hof 1, Tisch 25, Nummer 3 +Frank, Lena, = Hof 1, Tisch 25, Nummer 2 +Frank, Marie, = Hof 1, Tisch 26, Nummer 2 +Frank, Nadine, = Hof 1, Tisch 26, Nummer 4 +Franke, Amira, = Hof 2, Tisch 79, Nummer 2 +Franke, Julia, = Hof 2, Tisch 70, Nummer 3 +Franke, Marco, = Hof 2, Tisch 79, Nummer 3 +Franke, Michael, = Hof 2, Tisch 79, Nummer 4 +Franke, Olga, = Hof 2, Tisch 70, Nummer 4 +Freifrau von Waldeck, Antonia, = Hof 1, Tisch 6, Nummer 3 +Freiherr von Waldeck, Konstantin, Dr. = Hof 1, Tisch 6, Nummer 4 +Grothe, Alexander, Dr. h.c. = Hof 1, Tisch 5, Nummer 3 +Grothe, Beate, = Hof 1, Tisch 5, Nummer 5 +Haas, Jennifer, Dr. = Hof 2, Tisch 68, Nummer 5 +Haas, Patrick, = Hof 1, Tisch 44, Nummer 4 +Hansen, Giovanna, = Hof 1, Tisch 1, Nummer 3 +Hansen, Markus, = Hof 1, Tisch 1, Nummer 4 +Hansen, Nicole, Dr. = Hof 1, Tisch 45, Nummer 2 +Hansen, Olga, = Hof 1, Tisch 1, Nummer 2 +Hansen, Thomas, = Hof 1, Tisch 16, Nummer 3 +Hartmann, Deniz, = Hof 1, Tisch 13, Nummer 2 +Hartmann, Marija, = Hof 1, Tisch 23, Nummer 4 +Hartmann, Nadine, = Hof 1, Tisch 13, Nummer 3 +Hartmann, Olga, = Hof 1, Tisch 23, Nummer 2 +Hartmann, Thomas, = Hof 1, Tisch 23, Nummer 3 +Hoffmann, Emre, = Hof 2, Tisch 54, Nummer 2 +Hoffmann, Patrick, Prof. Dr. = Hof 1, Tisch 30, Nummer 4 +Hoffmann, Thomas, Dr. = Hof 1, Tisch 21, Nummer 4 +Horn, Kathrin, = Hof 1, Tisch 39, Nummer 2 +Horn, Layla, = Hof 1, Tisch 39, Nummer 4 +Horn, Leon, = Hof 1, Tisch 39, Nummer 5 +Horn, Michael, = Hof 1, Tisch 39, Nummer 3 +Kaya, Christina, = Hof 2, Tisch 56, Nummer 2 +Kaya, Luca, = Hof 2, Tisch 56, Nummer 4 +Kaya, Nicole, = Hof 2, Tisch 56, Nummer 3 +Kaya, Patrick, Dr. = Hof 1, Tisch 3, Nummer 4 +Kaya, Timo, Prof. Dr. = Hof 1, Tisch 45, Nummer 4 +Kessler, Ferdinand, Dr. = Hof 1, Tisch 5, Nummer 2 +Kessler, Viktoria, = Hof 1, Tisch 5, Nummer 4 +Klein, Emre, = Hof 1, Tisch 3, Nummer 3 +Klein, Lina, = Hof 2, Tisch 67, Nummer 4 +Klein, Markus, = Hof 1, Tisch 24, Nummer 2 +Klein, Milan, = Hof 2, Tisch 67, Nummer 3 +Klein, Olga, Dr. = Hof 2, Tisch 57, Nummer 4 +Klein, Stefanie, = Hof 2, Tisch 67, Nummer 2 +Koch, Emil, = Hof 1, Tisch 34, Nummer 4 +Koch, Jan, = Hof 1, Tisch 34, Nummer 2 +Koch, Kathrin, Dr. = Hof 2, Tisch 71, Nummer 2 +Koch, Marie, = Hof 1, Tisch 34, Nummer 5 +Koch, Michael, = Hof 1, Tisch 25, Nummer 5 +Koch, Olga, = Hof 1, Tisch 34, Nummer 3 +Koch, Sarah, = Hof 1, Tisch 25, Nummer 4 +Kovac, Anja, = Hof 1, Tisch 27, Nummer 2 +Kovac, Henry, = Hof 1, Tisch 35, Nummer 2 +Kovac, Lena, = Hof 1, Tisch 27, Nummer 4 +Kovac, Luca, = Hof 2, Tisch 75, Nummer 3 +Kovac, Marco, = Hof 1, Tisch 27, Nummer 3 +Kovac, Marija, = Hof 1, Tisch 35, Nummer 4 +Kovac, Matthias, = Hof 2, Tisch 55, Nummer 3 +Kovac, Tobias, = Hof 1, Tisch 35, Nummer 3 +Kraus, Markus, = Hof 1, Tisch 10, Nummer 2 +Kraus, Patrick, Dr. = Hof 2, Tisch 65, Nummer 5 +Krause, Andreas, = Hof 1, Tisch 38, Nummer 2 +Krause, Arda, = Hof 1, Tisch 38, Nummer 4 +Krause, Christina, Dr. = Hof 1, Tisch 4, Nummer 4 +Krause, Daniel, = Hof 1, Tisch 24, Nummer 4 +Krause, Dragana, Dr. = Hof 2, Tisch 75, Nummer 4 +Krause, Emma, = Hof 1, Tisch 38, Nummer 3 +Krause, Julia, = Hof 1, Tisch 38, Nummer 5 +Krause, Matthias, = Hof 2, Tisch 64, Nummer 4 +Krause, Thomas, = Hof 1, Tisch 44, Nummer 5 +Kuhn, Julia, Dr. = Hof 2, Tisch 71, Nummer 4 +Lange, Dragana, = Hof 1, Tisch 36, Nummer 3 +Lange, Jan, = Hof 2, Tisch 52, Nummer 3 +Lange, Michael, = Hof 1, Tisch 36, Nummer 4 +Lange, Sergej, = Hof 2, Tisch 54, Nummer 5 +Lange, Sofia, = Hof 2, Tisch 52, Nummer 5 +Lange, Svenja, = Hof 1, Tisch 36, Nummer 2 +Lehmann, Giovanna, = Hof 1, Tisch 8, Nummer 5 +Lehmann, Layla, = Hof 1, Tisch 8, Nummer 3 +Lehmann, Markus, = Hof 1, Tisch 9, Nummer 2 +Lehmann, Milan, = Hof 1, Tisch 8, Nummer 2 +Lehmann, Nicole, = Hof 1, Tisch 8, Nummer 4 +Lehmann, Patrick, = Hof 2, Tisch 81, Nummer 3 +Lehmann, Thomas, = Hof 1, Tisch 9, Nummer 3 +Ludwig, Aylin, Dr. = Hof 2, Tisch 64, Nummer 3 +Ludwig, Elias, = Hof 2, Tisch 82, Nummer 2 +Ludwig, Elif, = Hof 2, Tisch 82, Nummer 3 +Ludwig, Emre, = Hof 2, Tisch 82, Nummer 4 +Ludwig, Emre, Prof. Dr. = Hof 1, Tisch 24, Nummer 3 +Ludwig, Giovanna, = Hof 2, Tisch 82, Nummer 5 +Maier, Arda, = Hof 2, Tisch 78, Nummer 3 +Maier, Christian, = Hof 2, Tisch 78, Nummer 5 +Maier, Olga, = Hof 2, Tisch 78, Nummer 4 +Maier, Sarah, = Hof 2, Tisch 78, Nummer 2 +Neumann, Jennifer, = Hof 1, Tisch 42, Nummer 3 +Neumann, Lina, = Hof 1, Tisch 42, Nummer 5 +Neumann, Matteo, = Hof 1, Tisch 42, Nummer 2 +Neumann, Thomas, = Hof 1, Tisch 42, Nummer 4 +Nguyen, Anja, = Hof 2, Tisch 62, Nummer 3 +Nguyen, Daniel, = Hof 2, Tisch 62, Nummer 4 +Nguyen, Julia, = Hof 1, Tisch 15, Nummer 3 +Nguyen, Sofia, = Hof 2, Tisch 62, Nummer 2 +Nowak, Aylin, = Hof 2, Tisch 52, Nummer 4 +Nowak, Felix, = Hof 2, Tisch 53, Nummer 5 +Nowak, Kathrin, = Hof 2, Tisch 52, Nummer 2 +Nowak, Lina, = Hof 2, Tisch 53, Nummer 2 +Nowak, Markus, = Hof 2, Tisch 53, Nummer 4 +Nowak, Noah, = Hof 2, Tisch 53, Nummer 3 +Ott, Daniel, = Hof 1, Tisch 13, Nummer 4 +Ott, Hannah, = Hof 1, Tisch 12, Nummer 2 +Ott, Luca, = Hof 2, Tisch 75, Nummer 5 +Ott, Matthias, = Hof 1, Tisch 12, Nummer 3 +Ott, Melanie, = Hof 1, Tisch 13, Nummer 5 +Ott, Olga, = Hof 1, Tisch 12, Nummer 4 +Ott, Sergej, Prof. Dr. = Hof 1, Tisch 44, Nummer 2 +Ott, Yusuf, Prof. Dr. = Hof 2, Tisch 81, Nummer 4 +Peters, Christian, = Hof 1, Tisch 10, Nummer 4 +Peters, Nicole, = Hof 1, Tisch 45, Nummer 3 +Petrov, Giovanna, = Hof 1, Tisch 10, Nummer 5 +Petrov, Kathrin, = Hof 2, Tisch 46, Nummer 3 +Petrov, Kathrin, Prof. Dr. = Hof 1, Tisch 11, Nummer 5 +Petrov, Matthias, = Hof 2, Tisch 59, Nummer 3 +Petrov, Milan, = Hof 2, Tisch 46, Nummer 5 +Petrov, Sergej, = Hof 1, Tisch 31, Nummer 4 +Pohl, Dragana, = Hof 2, Tisch 77, Nummer 3 +Pohl, Emre, = Hof 2, Tisch 77, Nummer 2 +Pohl, Mia, = Hof 2, Tisch 77, Nummer 5 +Pohl, Theo, = Hof 2, Tisch 77, Nummer 4 +Polat, Kathrin, = Hof 1, Tisch 31, Nummer 5 +Polat, Katrin, = Hof 2, Tisch 69, Nummer 2 +Polat, Marija, = Hof 1, Tisch 30, Nummer 5 +Polat, Markus, = Hof 2, Tisch 69, Nummer 3 +Polat, Sarah, = Hof 2, Tisch 70, Nummer 2 +Polat, Stefan, = Hof 2, Tisch 70, Nummer 5 +Polat, Stefanie, = Hof 2, Tisch 69, Nummer 4 +Popescu, Matthias, = Hof 1, Tisch 28, Nummer 5 +Richter, Anja, = Hof 1, Tisch 2, Nummer 2 +Richter, Anja, Prof. Dr. = Hof 2, Tisch 74, Nummer 3 +Richter, Anton, = Hof 1, Tisch 2, Nummer 5 +Richter, Greta, = Hof 1, Tisch 2, Nummer 4 +Richter, Julia, Prof. Dr. = Hof 2, Tisch 59, Nummer 4 +Richter, Marco, = Hof 1, Tisch 30, Nummer 3 +Richter, Matthias, = Hof 1, Tisch 2, Nummer 3 +Richter, Stefan, = Hof 2, Tisch 66, Nummer 2 +Rossi, Emilia, = Hof 2, Tisch 88, Nummer 2 +Rossi, Luca, = Hof 2, Tisch 88, Nummer 4 +Rossi, Melanie, = Hof 2, Tisch 88, Nummer 3 +Roth, Christian, = Hof 2, Tisch 73, Nummer 3 +Roth, Julia, Prof. Dr. = Hof 1, Tisch 15, Nummer 4 +Roth, Olga, = Hof 2, Tisch 58, Nummer 4 +Roth, Sarah, = Hof 2, Tisch 73, Nummer 2 +Roth, Sofia, = Hof 2, Tisch 73, Nummer 4 +Sahin, Kathrin, = Hof 2, Tisch 80, Nummer 3 +Sahin, Markus, = Hof 2, Tisch 80, Nummer 4 +Sahin, Nicole, = Hof 2, Tisch 80, Nummer 2 +Sahin, Patrick, = Hof 2, Tisch 80, Nummer 5 +Sahin, Thomas, = Hof 2, Tisch 74, Nummer 2 +Schmidt, Giovanna, = Hof 2, Tisch 60, Nummer 3 +Schmidt, Marie, = Hof 2, Tisch 60, Nummer 2 +Schmidt, Matthias, = Hof 2, Tisch 60, Nummer 4 +Schmidt, Nicole, = Hof 1, Tisch 16, Nummer 4 +Schmitt, Dennis, Prof. Dr. = Hof 2, Tisch 66, Nummer 3 +Schmitt, Markus, = Hof 1, Tisch 11, Nummer 4 +Schmitt, Markus, = Hof 2, Tisch 87, Nummer 4 +Schmitt, Sarah, = Hof 2, Tisch 87, Nummer 3 +Schmitt, Sofia, = Hof 2, Tisch 87, Nummer 2 +Schmitt, Stefan, Prof. Dr. = Hof 2, Tisch 72, Nummer 4 +Schwarz, Giovanna, = Hof 2, Tisch 65, Nummer 3 +Seidel, Anja, Dr. = Hof 1, Tisch 21, Nummer 2 +Seidel, Markus, Dr. = Hof 1, Tisch 10, Nummer 3 +Seidel, Yusuf, Prof. Dr. = Hof 1, Tisch 3, Nummer 2 +Seifert, Elif, = Hof 2, Tisch 68, Nummer 2 +Seifert, Leni, = Hof 2, Tisch 76, Nummer 2 +Seifert, Marco, Prof. Dr. = Hof 2, Tisch 65, Nummer 4 +Seifert, Nicole, = Hof 2, Tisch 76, Nummer 4 +Seifert, Stefanie, Dr. = Hof 1, Tisch 15, Nummer 2 +Seifert, Timo, = Hof 2, Tisch 76, Nummer 3 +Seifert, Yusuf, = Hof 2, Tisch 68, Nummer 3 +Simon, Andreas, = Hof 2, Tisch 84, Nummer 2 +Simon, Emma, = Hof 2, Tisch 84, Nummer 4 +Simon, Lena, = Hof 2, Tisch 84, Nummer 5 +Simon, Markus, = Hof 2, Tisch 84, Nummer 3 +Simon, Svenja, = Hof 1, Tisch 28, Nummer 2 +Stein, Ben, = Hof 2, Tisch 63, Nummer 2 +Stein, Emilia, = Hof 2, Tisch 63, Nummer 3 +Stein, Giovanna, = Hof 2, Tisch 63, Nummer 4 +Stein, Markus, Prof. Dr. = Hof 1, Tisch 28, Nummer 4 +Stein, Nadine, Dr. = Hof 1, Tisch 11, Nummer 2 +Stein, Thomas, = Hof 2, Tisch 63, Nummer 5 +Steinbach, Elisabeth, = Hof 1, Tisch 6, Nummer 5 +Steinbach, Georg, = Hof 1, Tisch 6, Nummer 2 +Thiel, Christina, = Hof 2, Tisch 86, Nummer 3 +Thiel, Jan, Dr. = Hof 2, Tisch 74, Nummer 4 +Thiel, Julia, = Hof 2, Tisch 86, Nummer 4 +Thiel, Yusuf, = Hof 2, Tisch 86, Nummer 2 +Tran, Marija, = Hof 2, Tisch 72, Nummer 2 +Tran, Olga, = Hof 1, Tisch 21, Nummer 5 +Tran, Thomas, Prof. Dr. = Hof 1, Tisch 31, Nummer 3 +Wagner, Henry, = Hof 1, Tisch 29, Nummer 5 +Wagner, Marco, = Hof 1, Tisch 29, Nummer 3 +Wagner, Nicole, = Hof 1, Tisch 29, Nummer 2 +Wagner, Sarah, = Hof 1, Tisch 29, Nummer 4 +Weber, Andreas, = Hof 2, Tisch 59, Nummer 2 +Weber, Julia, = Hof 1, Tisch 11, Nummer 3 +Weber, Katrin, = Hof 2, Tisch 71, Nummer 3 +Weber, Yusuf, = Hof 2, Tisch 65, Nummer 2 +Werner, Andreas, = Hof 1, Tisch 19, Nummer 3 +Werner, Dennis, Prof. Dr. = Hof 1, Tisch 21, Nummer 3 +Werner, Katrin, = Hof 2, Tisch 64, Nummer 2 +Werner, Luca, = Hof 2, Tisch 72, Nummer 3 +Werner, Marco, = Hof 1, Tisch 19, Nummer 4 +Werner, Nadine, = Hof 1, Tisch 19, Nummer 2 +Werner, Sandra, = Hof 1, Tisch 19, Nummer 5 +Winkler, Lena, = Hof 2, Tisch 46, Nummer 4 +Winkler, Marco, = Hof 1, Tisch 4, Nummer 3 +Winkler, Patrick, = Hof 2, Tisch 46, Nummer 2 +Winkler, Thomas, = Hof 1, Tisch 15, Nummer 5 +Wolf, Ben, = Hof 1, Tisch 43, Nummer 5 +Wolf, Emma, = Hof 1, Tisch 43, Nummer 4 +Wolf, Julia, = Hof 1, Tisch 43, Nummer 2 +Wolf, Thomas, = Hof 1, Tisch 43, Nummer 3 +Zimmermann, Jan, = Hof 1, Tisch 37, Nummer 5 +Zimmermann, Markus, = Hof 1, Tisch 37, Nummer 3 +Zimmermann, Mia, = Hof 1, Tisch 37, Nummer 2 +Zimmermann, Patrick, = Hof 2, Tisch 75, Nummer 2 +Zimmermann, Svenja, = Hof 1, Tisch 37, Nummer 4 diff --git a/work/innenhoefe/Sitzplatzverteilung.svg b/work/innenhoefe/Sitzplatzverteilung.svg index 8c8537a..8916ff5 100644 --- a/work/innenhoefe/Sitzplatzverteilung.svg +++ b/work/innenhoefe/Sitzplatzverteilung.svg @@ -1,480 +1,568 @@ - -Tisch 8 - -Tisch 27 - -Tisch 34 - -Tisch 47 - -Tisch 87 - -Tisch 41 - - - -Tisch 4 - - - - -Tisch 9 - - - - -Tisch 11 - - - + + +22 + + +26 + + +77 + + +81 + + +86 + + + + +33 + + + + +37 + + + + + +1 + + + + + +3 -Tisch 13 - -Tisch 21 - - - + +13 + + + + + +15 + + + + + +17 + + + + + +19 + + + + + +24 -Tisch 25 - - - - -Tisch 26 - - - - -Tisch 29 - - - - -Tisch 30 - - - - -Tisch 33 - - - - -Tisch 43 - - - - -Tisch 50 - - - - -Tisch 51 - - - - -Tisch 52 - - - + + + + +25 + + + + + +32 + + + + + +53 + + + + + +57 -Tisch 58 - - - - -Tisch 62 - - - - -Tisch 63 - - - + + + + +58 + + + + + +59 + + + + + +60 + + + + + +61 -Tisch 64 - - - + + + + +64 -Tisch 65 - - - - -Tisch 68 - - - + + + + +65 + + + + + +66 -Tisch 69 - - - + + + + +69 -Tisch 71 - - - + + + + +71 -Tisch 72 - -Tisch 77 - - - + +72 -Tisch 78 - - - + + + + +78 -Tisch 80 - - - - -Tisch 81 - - - + + + + +80 -Tisch 82 - - - - -Tisch 85 - - - + + + + +82 + + + + + +83 + + + + + +84 + + + + + +87 -Tisch 88 - - - - -Tisch 1 - - - - + + + + +88 -Tisch 2 - - - - - -Tisch 3 - - - - + + + + + +2 + + + + + + +4 -Tisch 5 + +5 -Tisch 6 + +6 -Tisch 7 + +7 + + + + + + +8 + + + + + + +9 -Tisch 10 - - - - + + + + + +10 + + + + + + +11 -Tisch 12 - - - - + + + + + +12 -Tisch 14 - - - - - -Tisch 15 - - - - + + + + + +14 -Tisch 16 - - - - - -Tisch 17 - - - - + + + + + +16 -Tisch 18 - - + + - - -Tisch 19 - - - - + + +18 -Tisch 20 - - - - - -Tisch 22 - - - - + + + + + +20 + + + + + + +21 -Tisch 23 - - - - - -Tisch 24 - - - - + + + + + +23 + + + + + + +27 -Tisch 28 - - - - + + + + + +28 + + + + + + +29 + + + + + + +30 -Tisch 31 - - - - - -Tisch 32 - - - - + + + + + +31 + + + + + + +34 -Tisch 35 - - - - + + + + + +35 -Tisch 36 - - - - - -Tisch 37 - - - - + + + + + +36 -Tisch 38 - - - - + + + + + +38 -Tisch 39 - - - - + + + + + +39 -Tisch 40 - - - - + + + + + +40 + + + + + + +41 -Tisch 42 - - - - + + + + + +42 + + + + + + +43 -Tisch 44 - - - - + + + + + +44 -Tisch 45 - - - - + + + + + +45 -Tisch 46 - - - - + + + + + +46 + + + + + + +47 -Tisch 48 - + - + + +48 -Tisch 49 - - - - - -Tisch 53 - - - - + + + + + +49 + + + + + + +50 + + + + + + +51 + + + + + + +52 -Tisch 54 - - - - + + + + + +54 -Tisch 55 - - - - + + + + + +55 -Tisch 56 - - - - - -Tisch 57 - - - - - -Tisch 59 - - - - - -Tisch 60 - - - - - -Tisch 61 - - - - - -Tisch 66 - - - - + + + + + +56 + + + + + + +62 + + + + + + +63 -Tisch 67 - - - - + + + + + +67 + + + + + + +68 -Tisch 70 - - - - + + + + + +70 -Tisch 73 - - + + + +73 -Tisch 74 - - - - + + + + + +74 -Tisch 75 - - - - + + + + + +75 -Tisch 76 - - - - + + + + + +76 -Tisch 79 - - - - - -Tisch 83 - - - - - -Tisch 84 - - - - - -Tisch 86 - - - - + + + + + +79 + + + + + + +85 diff --git a/work/innenhoefe/TischePersonen.txt b/work/innenhoefe/TischePersonen.txt index aa66bc7..e11d50d 100644 --- a/work/innenhoefe/TischePersonen.txt +++ b/work/innenhoefe/TischePersonen.txt @@ -1,476 +1,476 @@ [1] -Dr. Patrick Kaya = Hof 1, Tisch 1, Nummer 1 -Dr. Christina Krause = Hof 1, Tisch 1, Nummer 2 -Dr. Jan Bianchi = Hof 1, Tisch 1, Nummer 3 - Marco Winkler = Hof 1, Tisch 1, Nummer 4 + Olga Hansen = Hof 1, Tisch 1, Nummer 1 + Giovanna Hansen = Hof 1, Tisch 1, Nummer 2 + Markus Hansen = Hof 1, Tisch 1, Nummer 3 [2] - Julia Weber = Hof 1, Tisch 2, Nummer 1 - Yusuf Bauer = Hof 1, Tisch 2, Nummer 2 - Emre Klein = Hof 1, Tisch 2, Nummer 3 -Prof. Dr. Yusuf Seidel = Hof 1, Tisch 2, Nummer 4 + Anja Richter = Hof 1, Tisch 2, Nummer 1 + Matthias Richter = Hof 1, Tisch 2, Nummer 2 + Greta Richter = Hof 1, Tisch 2, Nummer 3 + Anton Richter = Hof 1, Tisch 2, Nummer 4 [3] -Dr. Markus Seidel = Hof 1, Tisch 3, Nummer 1 - Giovanna Petrov = Hof 1, Tisch 3, Nummer 2 - Christian Peters = Hof 1, Tisch 3, Nummer 3 - Markus Kraus = Hof 1, Tisch 3, Nummer 4 +Prof. Dr. Yusuf Seidel = Hof 1, Tisch 3, Nummer 1 + Emre Klein = Hof 1, Tisch 3, Nummer 2 +Dr. Patrick Kaya = Hof 1, Tisch 3, Nummer 3 + Yusuf Bauer = Hof 1, Tisch 3, Nummer 4 [4] -Prof. Dr. Kathrin Petrov = Hof 1, Tisch 4, Nummer 1 - Markus Schmitt = Hof 1, Tisch 4, Nummer 2 -Dr. Nadine Stein = Hof 1, Tisch 4, Nummer 3 +Dr. Jan Bianchi = Hof 1, Tisch 4, Nummer 1 + Marco Winkler = Hof 1, Tisch 4, Nummer 2 +Dr. Christina Krause = Hof 1, Tisch 4, Nummer 3 [5] - Beate Grothe = Hof 1, Tisch 5, Nummer 1 - Viktoria Kessler = Hof 1, Tisch 5, Nummer 2 -Dr. Ferdinand Kessler = Hof 1, Tisch 5, Nummer 3 -Dr. h.c. Alexander Grothe = Hof 1, Tisch 5, Nummer 4 +Dr. Ferdinand Kessler = Hof 1, Tisch 5, Nummer 1 +Dr. h.c. Alexander Grothe = Hof 1, Tisch 5, Nummer 2 + Viktoria Kessler = Hof 1, Tisch 5, Nummer 3 + Beate Grothe = Hof 1, Tisch 5, Nummer 4 [6] -Dr. Konstantin Freiherr von Waldeck = Hof 1, Tisch 6, Nummer 1 - Elisabeth Steinbach = Hof 1, Tisch 6, Nummer 2 - Antonia Freifrau von Waldeck = Hof 1, Tisch 6, Nummer 3 - Georg Steinbach = Hof 1, Tisch 6, Nummer 4 + Georg Steinbach = Hof 1, Tisch 6, Nummer 1 + Antonia Freifrau von Waldeck = Hof 1, Tisch 6, Nummer 2 +Dr. Konstantin Freiherr von Waldeck = Hof 1, Tisch 6, Nummer 3 + Elisabeth Steinbach = Hof 1, Tisch 6, Nummer 4 [7] - Maximilian Dallmann = Hof 1, Tisch 7, Nummer 1 - Margarete Dallmann = Hof 1, Tisch 7, Nummer 2 + Charlotte Dallmann = Hof 1, Tisch 7, Nummer 1 + Maximilian Dallmann = Hof 1, Tisch 7, Nummer 2 Heinrich Dallmann = Hof 1, Tisch 7, Nummer 3 - Charlotte Dallmann = Hof 1, Tisch 7, Nummer 4 + Margarete Dallmann = Hof 1, Tisch 7, Nummer 4 [8] + Milan Lehmann = Hof 1, Tisch 8, Nummer 1 + Layla Lehmann = Hof 1, Tisch 8, Nummer 2 + Nicole Lehmann = Hof 1, Tisch 8, Nummer 3 + Giovanna Lehmann = Hof 1, Tisch 8, Nummer 4 [9] - Nadine Frank = Hof 1, Tisch 9, Nummer 1 - Lena Frank = Hof 1, Tisch 9, Nummer 2 - Finn Frank = Hof 1, Tisch 9, Nummer 3 + Markus Lehmann = Hof 1, Tisch 9, Nummer 1 + Thomas Lehmann = Hof 1, Tisch 9, Nummer 2 [10] - Yusuf Engel = Hof 1, Tisch 10, Nummer 1 - Marie Frank = Hof 1, Tisch 10, Nummer 2 - Anja Engel = Hof 1, Tisch 10, Nummer 3 - Dennis Frank = Hof 1, Tisch 10, Nummer 4 + Markus Kraus = Hof 1, Tisch 10, Nummer 1 +Dr. Markus Seidel = Hof 1, Tisch 10, Nummer 2 + Christian Peters = Hof 1, Tisch 10, Nummer 3 + Giovanna Petrov = Hof 1, Tisch 10, Nummer 4 [11] - Julia Engel = Hof 1, Tisch 11, Nummer 1 - Nicole Engel = Hof 1, Tisch 11, Nummer 2 - Anton Engel = Hof 1, Tisch 11, Nummer 3 +Dr. Nadine Stein = Hof 1, Tisch 11, Nummer 1 + Julia Weber = Hof 1, Tisch 11, Nummer 2 + Markus Schmitt = Hof 1, Tisch 11, Nummer 3 +Prof. Dr. Kathrin Petrov = Hof 1, Tisch 11, Nummer 4 [12] - Thomas Winkler = Hof 1, Tisch 12, Nummer 1 -Dr. Jan Esposito = Hof 1, Tisch 12, Nummer 2 - Nicole Schmidt = Hof 1, Tisch 12, Nummer 3 - Thomas Hansen = Hof 1, Tisch 12, Nummer 4 + Hannah Ott = Hof 1, Tisch 12, Nummer 1 + Matthias Ott = Hof 1, Tisch 12, Nummer 2 + Olga Ott = Hof 1, Tisch 12, Nummer 3 [13] -Dr. Stefanie Seifert = Hof 1, Tisch 13, Nummer 1 -Prof. Dr. Julia Roth = Hof 1, Tisch 13, Nummer 2 - Julia Nguyen = Hof 1, Tisch 13, Nummer 3 + Deniz Hartmann = Hof 1, Tisch 13, Nummer 1 + Nadine Hartmann = Hof 1, Tisch 13, Nummer 2 + Daniel Ott = Hof 1, Tisch 13, Nummer 3 + Melanie Ott = Hof 1, Tisch 13, Nummer 4 [14] - Sergej Aksoy = Hof 1, Tisch 14, Nummer 1 - Luca Aksoy = Hof 1, Tisch 14, Nummer 2 - Nadine Aksoy = Hof 1, Tisch 14, Nummer 3 - Sofia Aksoy = Hof 1, Tisch 14, Nummer 4 [15] - Henry Kovac = Hof 1, Tisch 15, Nummer 1 - Anja Kovac = Hof 1, Tisch 15, Nummer 2 - Lena Kovac = Hof 1, Tisch 15, Nummer 3 - Marco Kovac = Hof 1, Tisch 15, Nummer 4 +Dr. Stefanie Seifert = Hof 1, Tisch 15, Nummer 1 + Julia Nguyen = Hof 1, Tisch 15, Nummer 2 +Prof. Dr. Julia Roth = Hof 1, Tisch 15, Nummer 3 + Thomas Winkler = Hof 1, Tisch 15, Nummer 4 [16] - Giovanna Lehmann = Hof 1, Tisch 16, Nummer 1 - Milan Lehmann = Hof 1, Tisch 16, Nummer 2 - Markus Lehmann = Hof 1, Tisch 16, Nummer 3 - Layla Lehmann = Hof 1, Tisch 16, Nummer 4 +Dr. Jan Esposito = Hof 1, Tisch 16, Nummer 1 + Thomas Hansen = Hof 1, Tisch 16, Nummer 2 + Nicole Schmidt = Hof 1, Tisch 16, Nummer 3 [17] - Sarah Albrecht = Hof 1, Tisch 17, Nummer 1 - Nicole Lehmann = Hof 1, Tisch 17, Nummer 2 - Thomas Lehmann = Hof 1, Tisch 17, Nummer 3 - Andreas Albrecht = Hof 1, Tisch 17, Nummer 4 + Layla Berger = Hof 1, Tisch 17, Nummer 1 + Svenja Berger = Hof 1, Tisch 17, Nummer 2 + Stefan Berger = Hof 1, Tisch 17, Nummer 3 [18] - Svenja Simon = Hof 1, Tisch 18, Nummer 1 -Prof. Dr. Yusuf Albrecht = Hof 1, Tisch 18, Nummer 2 -Prof. Dr. Markus Stein = Hof 1, Tisch 18, Nummer 3 - Matthias Popescu = Hof 1, Tisch 18, Nummer 4 + Andreas Berger = Hof 1, Tisch 18, Nummer 1 + Jennifer Berger = Hof 1, Tisch 18, Nummer 2 + Anton Berger = Hof 1, Tisch 18, Nummer 3 [19] -Dr. Sandra Demir = Hof 1, Tisch 19, Nummer 1 -Prof. Dr. Timo Kaya = Hof 1, Tisch 19, Nummer 2 - Patrick Celik = Hof 1, Tisch 19, Nummer 3 - Elif Celik = Hof 1, Tisch 19, Nummer 4 + Nadine Werner = Hof 1, Tisch 19, Nummer 1 + Andreas Werner = Hof 1, Tisch 19, Nummer 2 + Marco Werner = Hof 1, Tisch 19, Nummer 3 + Sandra Werner = Hof 1, Tisch 19, Nummer 4 [20] - Lena Winkler = Hof 1, Tisch 20, Nummer 1 - Patrick Winkler = Hof 1, Tisch 20, Nummer 2 - Kathrin Petrov = Hof 1, Tisch 20, Nummer 3 - Milan Petrov = Hof 1, Tisch 20, Nummer 4 + Sarah Albrecht = Hof 1, Tisch 20, Nummer 1 + Leni Arnold = Hof 1, Tisch 20, Nummer 2 + Andreas Albrecht = Hof 1, Tisch 20, Nummer 3 + Patrick Arnold = Hof 1, Tisch 20, Nummer 4 [21] - Mia Bianchi = Hof 1, Tisch 21, Nummer 1 - Sandra Bianchi = Hof 1, Tisch 21, Nummer 2 - Thomas Bianchi = Hof 1, Tisch 21, Nummer 3 +Dr. Anja Seidel = Hof 1, Tisch 21, Nummer 1 +Prof. Dr. Dennis Werner = Hof 1, Tisch 21, Nummer 2 +Dr. Thomas Hoffmann = Hof 1, Tisch 21, Nummer 3 + Olga Tran = Hof 1, Tisch 21, Nummer 4 [22] - Sofia Schmitt = Hof 1, Tisch 22, Nummer 1 - Nicole Seifert = Hof 1, Tisch 22, Nummer 2 - Sarah Schmitt = Hof 1, Tisch 22, Nummer 3 - Markus Schmitt = Hof 1, Tisch 22, Nummer 4 + Michael Busch = Hof 1, Tisch 22, Nummer 1 + Olga Busch = Hof 1, Tisch 22, Nummer 2 + Emre Busch = Hof 1, Tisch 22, Nummer 3 + Marie Busch = Hof 1, Tisch 22, Nummer 4 [23] - Yusuf Seifert = Hof 1, Tisch 23, Nummer 1 - Leni Seifert = Hof 1, Tisch 23, Nummer 2 - Elif Seifert = Hof 1, Tisch 23, Nummer 3 - Timo Seifert = Hof 1, Tisch 23, Nummer 4 + Olga Hartmann = Hof 1, Tisch 23, Nummer 1 + Thomas Hartmann = Hof 1, Tisch 23, Nummer 2 + Marija Hartmann = Hof 1, Tisch 23, Nummer 3 [24] - Thomas Aksoy = Hof 1, Tisch 24, Nummer 1 - Tobias Kovac = Hof 1, Tisch 24, Nummer 2 - Marija Kovac = Hof 1, Tisch 24, Nummer 3 - Marie Aksoy = Hof 1, Tisch 24, Nummer 4 + Markus Klein = Hof 1, Tisch 24, Nummer 1 +Prof. Dr. Emre Ludwig = Hof 1, Tisch 24, Nummer 2 + Daniel Krause = Hof 1, Tisch 24, Nummer 3 + Nicole Aksoy = Hof 1, Tisch 24, Nummer 4 [25] - Anton Berger = Hof 1, Tisch 25, Nummer 1 - Jennifer Berger = Hof 1, Tisch 25, Nummer 2 - Layla Berger = Hof 1, Tisch 25, Nummer 3 + Lena Frank = Hof 1, Tisch 25, Nummer 1 + Finn Frank = Hof 1, Tisch 25, Nummer 2 + Sarah Koch = Hof 1, Tisch 25, Nummer 3 + Michael Koch = Hof 1, Tisch 25, Nummer 4 [26] - Marija Becker = Hof 1, Tisch 26, Nummer 1 -Prof. Dr. Yusuf Esposito = Hof 1, Tisch 26, Nummer 2 - Matthias Kovac = Hof 1, Tisch 26, Nummer 3 + Marie Frank = Hof 1, Tisch 26, Nummer 1 + Dennis Frank = Hof 1, Tisch 26, Nummer 2 + Nadine Frank = Hof 1, Tisch 26, Nummer 3 [27] + Anja Kovac = Hof 1, Tisch 27, Nummer 1 + Marco Kovac = Hof 1, Tisch 27, Nummer 2 + Lena Kovac = Hof 1, Tisch 27, Nummer 3 [28] - Emre Busch = Hof 1, Tisch 28, Nummer 1 - Olga Busch = Hof 1, Tisch 28, Nummer 2 - Michael Busch = Hof 1, Tisch 28, Nummer 3 - Marie Busch = Hof 1, Tisch 28, Nummer 4 + Svenja Simon = Hof 1, Tisch 28, Nummer 1 +Prof. Dr. Yusuf Albrecht = Hof 1, Tisch 28, Nummer 2 +Prof. Dr. Markus Stein = Hof 1, Tisch 28, Nummer 3 + Matthias Popescu = Hof 1, Tisch 28, Nummer 4 [29] - Melanie Rossi = Hof 1, Tisch 29, Nummer 1 - Luca Rossi = Hof 1, Tisch 29, Nummer 2 - Emilia Rossi = Hof 1, Tisch 29, Nummer 3 + Nicole Wagner = Hof 1, Tisch 29, Nummer 1 + Marco Wagner = Hof 1, Tisch 29, Nummer 2 + Sarah Wagner = Hof 1, Tisch 29, Nummer 3 + Henry Wagner = Hof 1, Tisch 29, Nummer 4 [30] - Olga Hansen = Hof 1, Tisch 30, Nummer 1 - Markus Hansen = Hof 1, Tisch 30, Nummer 2 - Giovanna Hansen = Hof 1, Tisch 30, Nummer 3 + Nadine Arnold = Hof 1, Tisch 30, Nummer 1 + Marco Richter = Hof 1, Tisch 30, Nummer 2 +Prof. Dr. Patrick Hoffmann = Hof 1, Tisch 30, Nummer 3 + Marija Polat = Hof 1, Tisch 30, Nummer 4 [31] - Matthias Richter = Hof 1, Tisch 31, Nummer 1 - Greta Richter = Hof 1, Tisch 31, Nummer 2 - Anton Richter = Hof 1, Tisch 31, Nummer 3 - Anja Richter = Hof 1, Tisch 31, Nummer 4 + Marija Aksoy = Hof 1, Tisch 31, Nummer 1 +Prof. Dr. Thomas Tran = Hof 1, Tisch 31, Nummer 2 + Sergej Petrov = Hof 1, Tisch 31, Nummer 3 + Kathrin Polat = Hof 1, Tisch 31, Nummer 4 [32] - Olga Tran = Hof 1, Tisch 32, Nummer 1 -Prof. Dr. Dennis Werner = Hof 1, Tisch 32, Nummer 2 -Dr. Thomas Hoffmann = Hof 1, Tisch 32, Nummer 3 -Dr. Anja Seidel = Hof 1, Tisch 32, Nummer 4 + Sergej Aksoy = Hof 1, Tisch 32, Nummer 1 + Sofia Aksoy = Hof 1, Tisch 32, Nummer 2 + Nadine Aksoy = Hof 1, Tisch 32, Nummer 3 + Luca Aksoy = Hof 1, Tisch 32, Nummer 4 [33] - Andreas Berger = Hof 1, Tisch 33, Nummer 1 - Svenja Berger = Hof 1, Tisch 33, Nummer 2 - Stefan Berger = Hof 1, Tisch 33, Nummer 3 + Elif Celik = Hof 1, Tisch 33, Nummer 1 + Patrick Celik = Hof 1, Tisch 33, Nummer 2 + Marie Aksoy = Hof 1, Tisch 33, Nummer 3 + Thomas Aksoy = Hof 1, Tisch 33, Nummer 4 [34] + Jan Koch = Hof 1, Tisch 34, Nummer 1 + Olga Koch = Hof 1, Tisch 34, Nummer 2 + Emil Koch = Hof 1, Tisch 34, Nummer 3 + Marie Koch = Hof 1, Tisch 34, Nummer 4 [35] - Felix Nowak = Hof 1, Tisch 35, Nummer 1 - Noah Nowak = Hof 1, Tisch 35, Nummer 2 - Lina Nowak = Hof 1, Tisch 35, Nummer 3 - Markus Nowak = Hof 1, Tisch 35, Nummer 4 + Henry Kovac = Hof 1, Tisch 35, Nummer 1 + Tobias Kovac = Hof 1, Tisch 35, Nummer 2 + Marija Kovac = Hof 1, Tisch 35, Nummer 3 [36] - Jan Braun = Hof 1, Tisch 36, Nummer 1 - Aylin Nowak = Hof 1, Tisch 36, Nummer 2 - Kathrin Nowak = Hof 1, Tisch 36, Nummer 3 - Dragana Braun = Hof 1, Tisch 36, Nummer 4 + Svenja Lange = Hof 1, Tisch 36, Nummer 1 + Dragana Lange = Hof 1, Tisch 36, Nummer 2 + Michael Lange = Hof 1, Tisch 36, Nummer 3 [37] - Christian Braun = Hof 1, Tisch 37, Nummer 1 - Julia Braun = Hof 1, Tisch 37, Nummer 2 - Nadine Braun = Hof 1, Tisch 37, Nummer 3 - Milan Braun = Hof 1, Tisch 37, Nummer 4 + Mia Zimmermann = Hof 1, Tisch 37, Nummer 1 + Markus Zimmermann = Hof 1, Tisch 37, Nummer 2 + Svenja Zimmermann = Hof 1, Tisch 37, Nummer 3 + Jan Zimmermann = Hof 1, Tisch 37, Nummer 4 [38] -Prof. Dr. Emre Ludwig = Hof 1, Tisch 38, Nummer 1 - Daniel Krause = Hof 1, Tisch 38, Nummer 2 - Markus Klein = Hof 1, Tisch 38, Nummer 3 - Nicole Aksoy = Hof 1, Tisch 38, Nummer 4 + Andreas Krause = Hof 1, Tisch 38, Nummer 1 + Emma Krause = Hof 1, Tisch 38, Nummer 2 + Arda Krause = Hof 1, Tisch 38, Nummer 3 + Julia Krause = Hof 1, Tisch 38, Nummer 4 [39] - Sandra Werner = Hof 1, Tisch 39, Nummer 1 - Marco Werner = Hof 1, Tisch 39, Nummer 2 - Andreas Werner = Hof 1, Tisch 39, Nummer 3 - Nadine Werner = Hof 1, Tisch 39, Nummer 4 + Kathrin Horn = Hof 1, Tisch 39, Nummer 1 + Michael Horn = Hof 1, Tisch 39, Nummer 2 + Layla Horn = Hof 1, Tisch 39, Nummer 3 + Leon Horn = Hof 1, Tisch 39, Nummer 4 [40] - Marija Polat = Hof 1, Tisch 40, Nummer 1 - Marco Richter = Hof 1, Tisch 40, Nummer 2 - Nadine Arnold = Hof 1, Tisch 40, Nummer 3 -Prof. Dr. Patrick Hoffmann = Hof 1, Tisch 40, Nummer 4 + Nadine Braun = Hof 1, Tisch 40, Nummer 1 + Jan Braun = Hof 1, Tisch 40, Nummer 2 + Dragana Braun = Hof 1, Tisch 40, Nummer 3 [41] - Thomas Krause = Hof 1, Tisch 41, Nummer 1 - Nicole Peters = Hof 1, Tisch 41, Nummer 2 + Milan Braun = Hof 1, Tisch 41, Nummer 1 + Christian Braun = Hof 1, Tisch 41, Nummer 2 + Julia Braun = Hof 1, Tisch 41, Nummer 3 [42] - Dragana Bauer = Hof 1, Tisch 42, Nummer 1 -Dr. Nicole Hansen = Hof 1, Tisch 42, Nummer 2 - Patrick Haas = Hof 1, Tisch 42, Nummer 3 -Prof. Dr. Sergej Ott = Hof 1, Tisch 42, Nummer 4 + Matteo Neumann = Hof 1, Tisch 42, Nummer 1 + Jennifer Neumann = Hof 1, Tisch 42, Nummer 2 + Thomas Neumann = Hof 1, Tisch 42, Nummer 3 + Lina Neumann = Hof 1, Tisch 42, Nummer 4 [43] - Nicole Kaya = Hof 1, Tisch 43, Nummer 1 - Luca Kaya = Hof 1, Tisch 43, Nummer 2 - Christina Kaya = Hof 1, Tisch 43, Nummer 3 + Julia Wolf = Hof 1, Tisch 43, Nummer 1 + Thomas Wolf = Hof 1, Tisch 43, Nummer 2 + Emma Wolf = Hof 1, Tisch 43, Nummer 3 + Ben Wolf = Hof 1, Tisch 43, Nummer 4 [44] - Marie Schmidt = Hof 1, Tisch 44, Nummer 1 - Giovanna Schmidt = Hof 1, Tisch 44, Nummer 2 - Andreas Weber = Hof 1, Tisch 44, Nummer 3 - Matthias Schmidt = Hof 1, Tisch 44, Nummer 4 +Prof. Dr. Sergej Ott = Hof 1, Tisch 44, Nummer 1 + Dragana Bauer = Hof 1, Tisch 44, Nummer 2 + Patrick Haas = Hof 1, Tisch 44, Nummer 3 + Thomas Krause = Hof 1, Tisch 44, Nummer 4 [45] - Markus Barth = Hof 1, Tisch 45, Nummer 1 -Prof. Dr. Julia Richter = Hof 1, Tisch 45, Nummer 2 -Dr. Jennifer Haas = Hof 1, Tisch 45, Nummer 3 - Matthias Petrov = Hof 1, Tisch 45, Nummer 4 +Dr. Nicole Hansen = Hof 1, Tisch 45, Nummer 1 + Nicole Peters = Hof 1, Tisch 45, Nummer 2 +Prof. Dr. Timo Kaya = Hof 1, Tisch 45, Nummer 3 +Dr. Sandra Demir = Hof 1, Tisch 45, Nummer 4 [46] - Sarah Wagner = Hof 2, Tisch 46, Nummer 1 - Henry Wagner = Hof 2, Tisch 46, Nummer 2 - Nicole Wagner = Hof 2, Tisch 46, Nummer 3 - Marco Wagner = Hof 2, Tisch 46, Nummer 4 + Patrick Winkler = Hof 2, Tisch 46, Nummer 1 + Kathrin Petrov = Hof 2, Tisch 46, Nummer 2 + Lena Winkler = Hof 2, Tisch 46, Nummer 3 + Milan Petrov = Hof 2, Tisch 46, Nummer 4 [47] + Christian Arnold = Hof 2, Tisch 47, Nummer 1 + Mila Arnold = Hof 2, Tisch 47, Nummer 2 + Jennifer Arnold = Hof 2, Tisch 47, Nummer 3 [48] - Emil Koch = Hof 2, Tisch 48, Nummer 1 - Marie Koch = Hof 2, Tisch 48, Nummer 2 - Olga Koch = Hof 2, Tisch 48, Nummer 3 - Jan Koch = Hof 2, Tisch 48, Nummer 4 + Nicole Engel = Hof 2, Tisch 48, Nummer 1 + Anton Engel = Hof 2, Tisch 48, Nummer 2 + Julia Engel = Hof 2, Tisch 48, Nummer 3 [49] - Patrick Busch = Hof 2, Tisch 49, Nummer 1 - Emre Hoffmann = Hof 2, Tisch 49, Nummer 2 - Michael Koch = Hof 2, Tisch 49, Nummer 3 - Sarah Koch = Hof 2, Tisch 49, Nummer 4 [50] - Jan Becker = Hof 2, Tisch 50, Nummer 1 - Sandra Becker = Hof 2, Tisch 50, Nummer 2 - Nicole Becker = Hof 2, Tisch 50, Nummer 3 + Thomas Bianchi = Hof 2, Tisch 50, Nummer 1 + Sandra Bianchi = Hof 2, Tisch 50, Nummer 2 + Mia Bianchi = Hof 2, Tisch 50, Nummer 3 [51] - Sofia Nguyen = Hof 2, Tisch 51, Nummer 1 - Anja Nguyen = Hof 2, Tisch 51, Nummer 2 - Daniel Nguyen = Hof 2, Tisch 51, Nummer 3 [52] - Mila Arnold = Hof 2, Tisch 52, Nummer 1 - Christian Arnold = Hof 2, Tisch 52, Nummer 2 - Leni Arnold = Hof 2, Tisch 52, Nummer 3 + Kathrin Nowak = Hof 2, Tisch 52, Nummer 1 + Jan Lange = Hof 2, Tisch 52, Nummer 2 + Aylin Nowak = Hof 2, Tisch 52, Nummer 3 + Sofia Lange = Hof 2, Tisch 52, Nummer 4 [53] - Sarah Polat = Hof 2, Tisch 53, Nummer 1 - Stefan Polat = Hof 2, Tisch 53, Nummer 2 - Patrick Arnold = Hof 2, Tisch 53, Nummer 3 - Jennifer Arnold = Hof 2, Tisch 53, Nummer 4 + Lina Nowak = Hof 2, Tisch 53, Nummer 1 + Noah Nowak = Hof 2, Tisch 53, Nummer 2 + Markus Nowak = Hof 2, Tisch 53, Nummer 3 + Felix Nowak = Hof 2, Tisch 53, Nummer 4 [54] - Kathrin Polat = Hof 2, Tisch 54, Nummer 1 - Sergej Petrov = Hof 2, Tisch 54, Nummer 2 -Prof. Dr. Thomas Tran = Hof 2, Tisch 54, Nummer 3 - Marija Aksoy = Hof 2, Tisch 54, Nummer 4 + Emre Hoffmann = Hof 2, Tisch 54, Nummer 1 + Patrick Busch = Hof 2, Tisch 54, Nummer 2 +Prof. Dr. Dragana Dietrich = Hof 2, Tisch 54, Nummer 3 + Sergej Lange = Hof 2, Tisch 54, Nummer 4 [55] - Kathrin Sahin = Hof 2, Tisch 55, Nummer 1 - Patrick Sahin = Hof 2, Tisch 55, Nummer 2 - Markus Sahin = Hof 2, Tisch 55, Nummer 3 - Nicole Sahin = Hof 2, Tisch 55, Nummer 4 + Marija Becker = Hof 2, Tisch 55, Nummer 1 + Matthias Kovac = Hof 2, Tisch 55, Nummer 2 +Prof. Dr. Yusuf Esposito = Hof 2, Tisch 55, Nummer 3 [56] - Emre Ludwig = Hof 2, Tisch 56, Nummer 1 - Elias Ludwig = Hof 2, Tisch 56, Nummer 2 - Elif Ludwig = Hof 2, Tisch 56, Nummer 3 - Giovanna Ludwig = Hof 2, Tisch 56, Nummer 4 + Christina Kaya = Hof 2, Tisch 56, Nummer 1 + Nicole Kaya = Hof 2, Tisch 56, Nummer 2 + Luca Kaya = Hof 2, Tisch 56, Nummer 3 [57] -Dr. Olga Klein = Hof 2, Tisch 57, Nummer 1 -Prof. Dr. Marco Seifert = Hof 2, Tisch 57, Nummer 2 -Dr. Aylin Ludwig = Hof 2, Tisch 57, Nummer 3 -Dr. Patrick Kraus = Hof 2, Tisch 57, Nummer 4 +Prof. Dr. Emre Albrecht = Hof 2, Tisch 57, Nummer 1 +Dr. Jennifer Arnold = Hof 2, Tisch 57, Nummer 2 +Dr. Olga Klein = Hof 2, Tisch 57, Nummer 3 [58] - Yusuf Weber = Hof 2, Tisch 58, Nummer 1 - Giovanna Schwarz = Hof 2, Tisch 58, Nummer 2 - Matthias Krause = Hof 2, Tisch 58, Nummer 3 + Yusuf Engel = Hof 2, Tisch 58, Nummer 1 + Anja Engel = Hof 2, Tisch 58, Nummer 2 + Olga Roth = Hof 2, Tisch 58, Nummer 3 + Thomas Bianchi = Hof 2, Tisch 58, Nummer 4 [59] - Katrin Werner = Hof 2, Tisch 59, Nummer 1 - Sergej Lange = Hof 2, Tisch 59, Nummer 2 -Dr. Michael Aksoy = Hof 2, Tisch 59, Nummer 3 -Prof. Dr. Dragana Dietrich = Hof 2, Tisch 59, Nummer 4 + Andreas Weber = Hof 2, Tisch 59, Nummer 1 + Matthias Petrov = Hof 2, Tisch 59, Nummer 2 +Prof. Dr. Julia Richter = Hof 2, Tisch 59, Nummer 3 [60] - Arda Maier = Hof 2, Tisch 60, Nummer 1 - Olga Maier = Hof 2, Tisch 60, Nummer 2 - Christian Maier = Hof 2, Tisch 60, Nummer 3 - Sarah Maier = Hof 2, Tisch 60, Nummer 4 + Marie Schmidt = Hof 2, Tisch 60, Nummer 1 + Giovanna Schmidt = Hof 2, Tisch 60, Nummer 2 + Matthias Schmidt = Hof 2, Tisch 60, Nummer 3 [61] - Andreas Simon = Hof 2, Tisch 61, Nummer 1 - Markus Simon = Hof 2, Tisch 61, Nummer 2 - Emma Simon = Hof 2, Tisch 61, Nummer 3 - Lena Simon = Hof 2, Tisch 61, Nummer 4 + Jan Becker = Hof 2, Tisch 61, Nummer 1 + Sandra Becker = Hof 2, Tisch 61, Nummer 2 + Nicole Becker = Hof 2, Tisch 61, Nummer 3 [62] - Patrick Zimmermann = Hof 2, Tisch 62, Nummer 1 - Stefan Richter = Hof 2, Tisch 62, Nummer 2 -Prof. Dr. Dennis Schmitt = Hof 2, Tisch 62, Nummer 3 + Sofia Nguyen = Hof 2, Tisch 62, Nummer 1 + Anja Nguyen = Hof 2, Tisch 62, Nummer 2 + Daniel Nguyen = Hof 2, Tisch 62, Nummer 3 [63] - Milan Klein = Hof 2, Tisch 63, Nummer 1 - Stefanie Klein = Hof 2, Tisch 63, Nummer 2 - Lina Klein = Hof 2, Tisch 63, Nummer 3 + Ben Stein = Hof 2, Tisch 63, Nummer 1 + Emilia Stein = Hof 2, Tisch 63, Nummer 2 + Giovanna Stein = Hof 2, Tisch 63, Nummer 3 + Thomas Stein = Hof 2, Tisch 63, Nummer 4 [64] - Sarah Roth = Hof 2, Tisch 64, Nummer 1 - Christian Roth = Hof 2, Tisch 64, Nummer 2 - Sofia Roth = Hof 2, Tisch 64, Nummer 3 + Katrin Werner = Hof 2, Tisch 64, Nummer 1 +Dr. Aylin Ludwig = Hof 2, Tisch 64, Nummer 2 + Matthias Krause = Hof 2, Tisch 64, Nummer 3 +Dr. Michael Aksoy = Hof 2, Tisch 64, Nummer 4 [65] - Thomas Sahin = Hof 2, Tisch 65, Nummer 1 -Prof. Dr. Anja Richter = Hof 2, Tisch 65, Nummer 2 -Dr. Jan Thiel = Hof 2, Tisch 65, Nummer 3 + Yusuf Weber = Hof 2, Tisch 65, Nummer 1 + Giovanna Schwarz = Hof 2, Tisch 65, Nummer 2 +Prof. Dr. Marco Seifert = Hof 2, Tisch 65, Nummer 3 +Dr. Patrick Kraus = Hof 2, Tisch 65, Nummer 4 [66] - Patrick Barth = Hof 2, Tisch 66, Nummer 1 - Nadine Barth = Hof 2, Tisch 66, Nummer 2 - Timo Barth = Hof 2, Tisch 66, Nummer 3 - Lina Barth = Hof 2, Tisch 66, Nummer 4 + Stefan Richter = Hof 2, Tisch 66, Nummer 1 +Prof. Dr. Dennis Schmitt = Hof 2, Tisch 66, Nummer 2 [67] -Prof. Dr. Emre Albrecht = Hof 2, Tisch 67, Nummer 1 - Olga Roth = Hof 2, Tisch 67, Nummer 2 -Dr. Jennifer Arnold = Hof 2, Tisch 67, Nummer 3 - Thomas Bianchi = Hof 2, Tisch 67, Nummer 4 + Stefanie Klein = Hof 2, Tisch 67, Nummer 1 + Milan Klein = Hof 2, Tisch 67, Nummer 2 + Lina Klein = Hof 2, Tisch 67, Nummer 3 [68] - Katrin Weber = Hof 2, Tisch 68, Nummer 1 -Dr. Kathrin Koch = Hof 2, Tisch 68, Nummer 2 -Dr. Julia Kuhn = Hof 2, Tisch 68, Nummer 3 + Elif Seifert = Hof 2, Tisch 68, Nummer 1 + Yusuf Seifert = Hof 2, Tisch 68, Nummer 2 + Markus Barth = Hof 2, Tisch 68, Nummer 3 +Dr. Jennifer Haas = Hof 2, Tisch 68, Nummer 4 [69] - Marija Tran = Hof 2, Tisch 69, Nummer 1 - Luca Werner = Hof 2, Tisch 69, Nummer 2 -Prof. Dr. Stefan Schmitt = Hof 2, Tisch 69, Nummer 3 + Katrin Polat = Hof 2, Tisch 69, Nummer 1 + Markus Polat = Hof 2, Tisch 69, Nummer 2 + Stefanie Polat = Hof 2, Tisch 69, Nummer 3 [70] - Jan Zimmermann = Hof 2, Tisch 70, Nummer 1 - Markus Zimmermann = Hof 2, Tisch 70, Nummer 2 - Mia Zimmermann = Hof 2, Tisch 70, Nummer 3 - Svenja Zimmermann = Hof 2, Tisch 70, Nummer 4 + Sarah Polat = Hof 2, Tisch 70, Nummer 1 + Julia Franke = Hof 2, Tisch 70, Nummer 2 + Olga Franke = Hof 2, Tisch 70, Nummer 3 + Stefan Polat = Hof 2, Tisch 70, Nummer 4 [71] - Luca Kovac = Hof 2, Tisch 71, Nummer 1 -Dr. Dragana Krause = Hof 2, Tisch 71, Nummer 2 - Luca Ott = Hof 2, Tisch 71, Nummer 3 +Dr. Kathrin Koch = Hof 2, Tisch 71, Nummer 1 + Katrin Weber = Hof 2, Tisch 71, Nummer 2 +Dr. Julia Kuhn = Hof 2, Tisch 71, Nummer 3 [72] - Dragana Lange = Hof 2, Tisch 72, Nummer 1 - Michael Lange = Hof 2, Tisch 72, Nummer 2 - Sofia Lange = Hof 2, Tisch 72, Nummer 3 + Marija Tran = Hof 2, Tisch 72, Nummer 1 + Luca Werner = Hof 2, Tisch 72, Nummer 2 +Prof. Dr. Stefan Schmitt = Hof 2, Tisch 72, Nummer 3 [73] - Michael Franke = Hof 2, Tisch 73, Nummer 1 - Amira Franke = Hof 2, Tisch 73, Nummer 2 - Svenja Lange = Hof 2, Tisch 73, Nummer 3 - Jan Lange = Hof 2, Tisch 73, Nummer 4 + Sarah Roth = Hof 2, Tisch 73, Nummer 1 + Christian Roth = Hof 2, Tisch 73, Nummer 2 + Sofia Roth = Hof 2, Tisch 73, Nummer 3 [74] - Emma Krause = Hof 2, Tisch 74, Nummer 1 - Julia Krause = Hof 2, Tisch 74, Nummer 2 - Arda Krause = Hof 2, Tisch 74, Nummer 3 - Andreas Krause = Hof 2, Tisch 74, Nummer 4 + Thomas Sahin = Hof 2, Tisch 74, Nummer 1 +Prof. Dr. Anja Richter = Hof 2, Tisch 74, Nummer 2 +Dr. Jan Thiel = Hof 2, Tisch 74, Nummer 3 [75] - Mia Pohl = Hof 2, Tisch 75, Nummer 1 - Theo Pohl = Hof 2, Tisch 75, Nummer 2 - Dragana Pohl = Hof 2, Tisch 75, Nummer 3 - Emre Pohl = Hof 2, Tisch 75, Nummer 4 + Patrick Zimmermann = Hof 2, Tisch 75, Nummer 1 + Luca Kovac = Hof 2, Tisch 75, Nummer 2 +Dr. Dragana Krause = Hof 2, Tisch 75, Nummer 3 + Luca Ott = Hof 2, Tisch 75, Nummer 4 [76] - Giovanna Stein = Hof 2, Tisch 76, Nummer 1 - Thomas Stein = Hof 2, Tisch 76, Nummer 2 - Emilia Stein = Hof 2, Tisch 76, Nummer 3 - Ben Stein = Hof 2, Tisch 76, Nummer 4 + Leni Seifert = Hof 2, Tisch 76, Nummer 1 + Timo Seifert = Hof 2, Tisch 76, Nummer 2 + Nicole Seifert = Hof 2, Tisch 76, Nummer 3 [77] -Dr. Nadine Berger = Hof 2, Tisch 77, Nummer 1 -Prof. Dr. Yusuf Ott = Hof 2, Tisch 77, Nummer 2 - Patrick Lehmann = Hof 2, Tisch 77, Nummer 3 + Emre Pohl = Hof 2, Tisch 77, Nummer 1 + Dragana Pohl = Hof 2, Tisch 77, Nummer 2 + Theo Pohl = Hof 2, Tisch 77, Nummer 3 + Mia Pohl = Hof 2, Tisch 77, Nummer 4 [78] - Jennifer Dietrich = Hof 2, Tisch 78, Nummer 1 - Marco Dietrich = Hof 2, Tisch 78, Nummer 2 - Sofia Dietrich = Hof 2, Tisch 78, Nummer 3 + Sarah Maier = Hof 2, Tisch 78, Nummer 1 + Arda Maier = Hof 2, Tisch 78, Nummer 2 + Olga Maier = Hof 2, Tisch 78, Nummer 3 + Christian Maier = Hof 2, Tisch 78, Nummer 4 [79] - Thomas Wolf = Hof 2, Tisch 79, Nummer 1 - Julia Wolf = Hof 2, Tisch 79, Nummer 2 - Emma Wolf = Hof 2, Tisch 79, Nummer 3 - Ben Wolf = Hof 2, Tisch 79, Nummer 4 + Amira Franke = Hof 2, Tisch 79, Nummer 1 + Marco Franke = Hof 2, Tisch 79, Nummer 2 + Michael Franke = Hof 2, Tisch 79, Nummer 3 [80] - Matthias Ott = Hof 2, Tisch 80, Nummer 1 - Hannah Ott = Hof 2, Tisch 80, Nummer 2 - Melanie Ott = Hof 2, Tisch 80, Nummer 3 + Nicole Sahin = Hof 2, Tisch 80, Nummer 1 + Kathrin Sahin = Hof 2, Tisch 80, Nummer 2 + Markus Sahin = Hof 2, Tisch 80, Nummer 3 + Patrick Sahin = Hof 2, Tisch 80, Nummer 4 [81] - Julia Franke = Hof 2, Tisch 81, Nummer 1 - Marco Franke = Hof 2, Tisch 81, Nummer 2 - Olga Franke = Hof 2, Tisch 81, Nummer 3 +Dr. Nadine Berger = Hof 2, Tisch 81, Nummer 1 + Patrick Lehmann = Hof 2, Tisch 81, Nummer 2 +Prof. Dr. Yusuf Ott = Hof 2, Tisch 81, Nummer 3 [82] - Christina Thiel = Hof 2, Tisch 82, Nummer 1 - Julia Thiel = Hof 2, Tisch 82, Nummer 2 - Yusuf Thiel = Hof 2, Tisch 82, Nummer 3 + Elias Ludwig = Hof 2, Tisch 82, Nummer 1 + Elif Ludwig = Hof 2, Tisch 82, Nummer 2 + Emre Ludwig = Hof 2, Tisch 82, Nummer 3 + Giovanna Ludwig = Hof 2, Tisch 82, Nummer 4 [83] - Matteo Neumann = Hof 2, Tisch 83, Nummer 1 - Lina Neumann = Hof 2, Tisch 83, Nummer 2 - Jennifer Neumann = Hof 2, Tisch 83, Nummer 3 - Thomas Neumann = Hof 2, Tisch 83, Nummer 4 + Lina Barth = Hof 2, Tisch 83, Nummer 1 + Nadine Barth = Hof 2, Tisch 83, Nummer 2 + Timo Barth = Hof 2, Tisch 83, Nummer 3 + Patrick Barth = Hof 2, Tisch 83, Nummer 4 [84] - Michael Horn = Hof 2, Tisch 84, Nummer 1 - Layla Horn = Hof 2, Tisch 84, Nummer 2 - Kathrin Horn = Hof 2, Tisch 84, Nummer 3 - Leon Horn = Hof 2, Tisch 84, Nummer 4 + Andreas Simon = Hof 2, Tisch 84, Nummer 1 + Markus Simon = Hof 2, Tisch 84, Nummer 2 + Emma Simon = Hof 2, Tisch 84, Nummer 3 + Lena Simon = Hof 2, Tisch 84, Nummer 4 [85] - Thomas Hartmann = Hof 2, Tisch 85, Nummer 1 - Olga Hartmann = Hof 2, Tisch 85, Nummer 2 - Deniz Hartmann = Hof 2, Tisch 85, Nummer 3 + Sofia Dietrich = Hof 2, Tisch 85, Nummer 1 + Marco Dietrich = Hof 2, Tisch 85, Nummer 2 + Jennifer Dietrich = Hof 2, Tisch 85, Nummer 3 [86] - Nadine Hartmann = Hof 2, Tisch 86, Nummer 1 - Marija Hartmann = Hof 2, Tisch 86, Nummer 2 - Olga Ott = Hof 2, Tisch 86, Nummer 3 - Daniel Ott = Hof 2, Tisch 86, Nummer 4 + Yusuf Thiel = Hof 2, Tisch 86, Nummer 1 + Christina Thiel = Hof 2, Tisch 86, Nummer 2 + Julia Thiel = Hof 2, Tisch 86, Nummer 3 [87] + Sofia Schmitt = Hof 2, Tisch 87, Nummer 1 + Sarah Schmitt = Hof 2, Tisch 87, Nummer 2 + Markus Schmitt = Hof 2, Tisch 87, Nummer 3 [88] - Markus Polat = Hof 2, Tisch 88, Nummer 1 - Katrin Polat = Hof 2, Tisch 88, Nummer 2 - Stefanie Polat = Hof 2, Tisch 88, Nummer 3 + Emilia Rossi = Hof 2, Tisch 88, Nummer 1 + Melanie Rossi = Hof 2, Tisch 88, Nummer 2 + Luca Rossi = Hof 2, Tisch 88, Nummer 3 diff --git a/work/innenhoefe/bestellung.json b/work/innenhoefe/bestellung.json new file mode 100644 index 0000000..bcb4d7e --- /dev/null +++ b/work/innenhoefe/bestellung.json @@ -0,0 +1,1612 @@ +{ + "gruppen": [ + { + "name": "VIP Industrie: Vorstand Automobilkonzern (fest an Tisch 5, vor der Buehne)", + "tisch": 5, + "personen": [ + { + "vorname": "Alexander", + "nachname": "Grothe", + "titel": "Dr. h.c." + }, + { + "vorname": "Beate", + "nachname": "Grothe" + }, + { + "vorname": "Ferdinand", + "nachname": "Kessler", + "titel": "Dr." + }, + { + "vorname": "Viktoria", + "nachname": "Kessler" + } + ] + }, + { + "name": "VIP Wirtschaft: Bankvorstand (fest an Tisch 6)", + "tisch": 6, + "personen": [ + { + "vorname": "Konstantin", + "nachname": "Freiherr von Waldeck", + "titel": "Dr." + }, + { + "vorname": "Antonia", + "nachname": "Freifrau von Waldeck" + }, + { + "vorname": "Georg", + "nachname": "Steinbach" + }, + { + "vorname": "Elisabeth", + "nachname": "Steinbach" + } + ] + }, + { + "name": "VIP Industrie: Unternehmerfamilie (fest an Tisch 7)", + "tisch": 7, + "personen": [ + { + "vorname": "Heinrich", + "nachname": "Dallmann" + }, + { + "vorname": "Margarete", + "nachname": "Dallmann" + }, + { + "vorname": "Maximilian", + "nachname": "Dallmann" + }, + { + "vorname": "Charlotte", + "nachname": "Dallmann" + } + ] + }, + { + "name": "Familie Bianchi (Studierenden-Familie 1)", + "personen": [ + { + "vorname": "Sandra", + "nachname": "Bianchi" + }, + { + "vorname": "Thomas", + "nachname": "Bianchi" + }, + { + "vorname": "Mia", + "nachname": "Bianchi" + } + ] + }, + { + "name": "Familie Arnold (Studierenden-Familie 2)", + "personen": [ + { + "vorname": "Jennifer", + "nachname": "Arnold" + }, + { + "vorname": "Patrick", + "nachname": "Arnold" + }, + { + "vorname": "Leni", + "nachname": "Arnold" + }, + { + "vorname": "Christian", + "nachname": "Arnold" + }, + { + "vorname": "Mila", + "nachname": "Arnold" + } + ] + }, + { + "name": "Familie Seifert (Studierenden-Familie 3)", + "personen": [ + { + "vorname": "Nicole", + "nachname": "Seifert" + }, + { + "vorname": "Yusuf", + "nachname": "Seifert" + }, + { + "vorname": "Leni", + "nachname": "Seifert" + }, + { + "vorname": "Timo", + "nachname": "Seifert" + }, + { + "vorname": "Elif", + "nachname": "Seifert" + } + ] + }, + { + "name": "Familie Albrecht (Studierenden-Familie 4)", + "personen": [ + { + "vorname": "Sarah", + "nachname": "Albrecht" + }, + { + "vorname": "Andreas", + "nachname": "Albrecht" + } + ] + }, + { + "name": "Institut fuer Maschinenwesen", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Esposito", + "titel": "Prof. Dr." + }, + { + "vorname": "Marija", + "nachname": "Becker" + }, + { + "vorname": "Matthias", + "nachname": "Kovac" + } + ] + }, + { + "name": "Familie Kaya (Studierenden-Familie 5)", + "personen": [ + { + "vorname": "Nicole", + "nachname": "Kaya" + }, + { + "vorname": "Luca", + "nachname": "Kaya" + }, + { + "vorname": "Christina", + "nachname": "Kaya" + } + ] + }, + { + "name": "Lehrstuhl Thermodynamik", + "personen": [ + { + "vorname": "Julia", + "nachname": "Richter", + "titel": "Prof. Dr." + }, + { + "vorname": "Jennifer", + "nachname": "Haas", + "titel": "Dr." + }, + { + "vorname": "Markus", + "nachname": "Barth" + }, + { + "vorname": "Matthias", + "nachname": "Petrov" + }, + { + "vorname": "Andreas", + "nachname": "Weber" + } + ] + }, + { + "name": "Familie Schmidt (Studierenden-Familie 6)", + "personen": [ + { + "vorname": "Giovanna", + "nachname": "Schmidt" + }, + { + "vorname": "Matthias", + "nachname": "Schmidt" + }, + { + "vorname": "Marie", + "nachname": "Schmidt" + } + ] + }, + { + "name": "Familie Richter (Studierenden-Familie 7)", + "personen": [ + { + "vorname": "Anja", + "nachname": "Richter" + }, + { + "vorname": "Matthias", + "nachname": "Richter" + }, + { + "vorname": "Greta", + "nachname": "Richter" + }, + { + "vorname": "Anton", + "nachname": "Richter" + } + ] + }, + { + "name": "Institut fuer Informatik", + "personen": [ + { + "vorname": "Emre", + "nachname": "Albrecht", + "titel": "Prof. Dr." + }, + { + "vorname": "Thomas", + "nachname": "Bianchi" + }, + { + "vorname": "Olga", + "nachname": "Roth" + }, + { + "vorname": "Olga", + "nachname": "Klein", + "titel": "Dr." + }, + { + "vorname": "Jennifer", + "nachname": "Arnold", + "titel": "Dr." + } + ] + }, + { + "name": "Lehrstuhl Regelungstechnik", + "personen": [ + { + "vorname": "Dennis", + "nachname": "Werner", + "titel": "Prof. Dr." + }, + { + "vorname": "Thomas", + "nachname": "Hoffmann", + "titel": "Dr." + }, + { + "vorname": "Olga", + "nachname": "Tran" + }, + { + "vorname": "Anja", + "nachname": "Seidel", + "titel": "Dr." + } + ] + }, + { + "name": "Institut fuer Werkstoffkunde", + "personen": [ + { + "vorname": "Markus", + "nachname": "Stein", + "titel": "Prof. Dr." + }, + { + "vorname": "Matthias", + "nachname": "Popescu" + } + ] + }, + { + "name": "Lehrstuhl Stroemungsmechanik", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Albrecht", + "titel": "Prof. Dr." + }, + { + "vorname": "Svenja", + "nachname": "Simon" + } + ] + }, + { + "name": "Institut fuer Elektrotechnik", + "personen": [ + { + "vorname": "Julia", + "nachname": "Roth", + "titel": "Prof. Dr." + }, + { + "vorname": "Thomas", + "nachname": "Hansen" + }, + { + "vorname": "Nicole", + "nachname": "Schmidt" + }, + { + "vorname": "Julia", + "nachname": "Nguyen" + }, + { + "vorname": "Stefanie", + "nachname": "Seifert", + "titel": "Dr." + }, + { + "vorname": "Thomas", + "nachname": "Winkler" + }, + { + "vorname": "Jan", + "nachname": "Esposito", + "titel": "Dr." + } + ] + }, + { + "name": "Familie Becker (Studierenden-Familie 8)", + "personen": [ + { + "vorname": "Nicole", + "nachname": "Becker" + }, + { + "vorname": "Jan", + "nachname": "Becker" + }, + { + "vorname": "Sandra", + "nachname": "Becker" + } + ] + }, + { + "name": "Lehrstuhl Mathematik", + "personen": [ + { + "vorname": "Kathrin", + "nachname": "Petrov", + "titel": "Prof. Dr." + }, + { + "vorname": "Markus", + "nachname": "Seidel", + "titel": "Dr." + }, + { + "vorname": "Markus", + "nachname": "Kraus" + }, + { + "vorname": "Giovanna", + "nachname": "Petrov" + }, + { + "vorname": "Nadine", + "nachname": "Stein", + "titel": "Dr." + }, + { + "vorname": "Markus", + "nachname": "Schmitt" + }, + { + "vorname": "Christian", + "nachname": "Peters" + } + ] + }, + { + "name": "Familie Nguyen (Studierenden-Familie 9)", + "personen": [ + { + "vorname": "Anja", + "nachname": "Nguyen" + }, + { + "vorname": "Daniel", + "nachname": "Nguyen" + }, + { + "vorname": "Sofia", + "nachname": "Nguyen" + } + ] + }, + { + "name": "Familie Celik (Studierenden-Familie 10)", + "personen": [ + { + "vorname": "Elif", + "nachname": "Celik" + }, + { + "vorname": "Patrick", + "nachname": "Celik" + } + ] + }, + { + "name": "Familie Klein (Studierenden-Familie 11)", + "personen": [ + { + "vorname": "Stefanie", + "nachname": "Klein" + }, + { + "vorname": "Milan", + "nachname": "Klein" + }, + { + "vorname": "Lina", + "nachname": "Klein" + } + ] + }, + { + "name": "Familie Busch (Studierenden-Familie 12)", + "personen": [ + { + "vorname": "Olga", + "nachname": "Busch" + }, + { + "vorname": "Emre", + "nachname": "Busch" + }, + { + "vorname": "Marie", + "nachname": "Busch" + }, + { + "vorname": "Michael", + "nachname": "Busch" + } + ] + }, + { + "name": "Institut fuer Physik", + "personen": [ + { + "vorname": "Stefan", + "nachname": "Schmitt", + "titel": "Prof. Dr." + }, + { + "vorname": "Marija", + "nachname": "Tran" + }, + { + "vorname": "Kathrin", + "nachname": "Koch", + "titel": "Dr." + }, + { + "vorname": "Julia", + "nachname": "Kuhn", + "titel": "Dr." + }, + { + "vorname": "Katrin", + "nachname": "Weber" + }, + { + "vorname": "Luca", + "nachname": "Werner" + } + ] + }, + { + "name": "Familie Engel (Studierenden-Familie 13)", + "personen": [ + { + "vorname": "Anja", + "nachname": "Engel" + }, + { + "vorname": "Yusuf", + "nachname": "Engel" + }, + { + "vorname": "Julia", + "nachname": "Engel" + }, + { + "vorname": "Anton", + "nachname": "Engel" + }, + { + "vorname": "Nicole", + "nachname": "Engel" + } + ] + }, + { + "name": "Lehrstuhl Produktionstechnik", + "personen": [ + { + "vorname": "Emre", + "nachname": "Ludwig", + "titel": "Prof. Dr." + }, + { + "vorname": "Daniel", + "nachname": "Krause" + }, + { + "vorname": "Nicole", + "nachname": "Aksoy" + }, + { + "vorname": "Markus", + "nachname": "Klein" + } + ] + }, + { + "name": "Institut fuer Chemie", + "personen": [ + { + "vorname": "Dennis", + "nachname": "Schmitt", + "titel": "Prof. Dr." + }, + { + "vorname": "Luca", + "nachname": "Kovac" + }, + { + "vorname": "Dragana", + "nachname": "Krause", + "titel": "Dr." + }, + { + "vorname": "Luca", + "nachname": "Ott" + }, + { + "vorname": "Patrick", + "nachname": "Zimmermann" + }, + { + "vorname": "Stefan", + "nachname": "Richter" + } + ] + }, + { + "name": "Lehrstuhl Fahrzeugtechnik", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Seidel", + "titel": "Prof. Dr." + }, + { + "vorname": "Yusuf", + "nachname": "Bauer" + }, + { + "vorname": "Jan", + "nachname": "Bianchi", + "titel": "Dr." + }, + { + "vorname": "Marco", + "nachname": "Winkler" + }, + { + "vorname": "Emre", + "nachname": "Klein" + }, + { + "vorname": "Patrick", + "nachname": "Kaya", + "titel": "Dr." + }, + { + "vorname": "Christina", + "nachname": "Krause", + "titel": "Dr." + } + ] + }, + { + "name": "Familie Frank (Studierenden-Familie 14)", + "personen": [ + { + "vorname": "Nadine", + "nachname": "Frank" + }, + { + "vorname": "Dennis", + "nachname": "Frank" + }, + { + "vorname": "Marie", + "nachname": "Frank" + }, + { + "vorname": "Finn", + "nachname": "Frank" + }, + { + "vorname": "Lena", + "nachname": "Frank" + } + ] + }, + { + "name": "Familie Werner (Studierenden-Familie 15)", + "personen": [ + { + "vorname": "Sandra", + "nachname": "Werner" + }, + { + "vorname": "Andreas", + "nachname": "Werner" + }, + { + "vorname": "Nadine", + "nachname": "Werner" + }, + { + "vorname": "Marco", + "nachname": "Werner" + } + ] + }, + { + "name": "Familie Roth (Studierenden-Familie 16)", + "personen": [ + { + "vorname": "Sarah", + "nachname": "Roth" + }, + { + "vorname": "Christian", + "nachname": "Roth" + }, + { + "vorname": "Sofia", + "nachname": "Roth" + } + ] + }, + { + "name": "Institut fuer Bauingenieurwesen", + "personen": [ + { + "vorname": "Marco", + "nachname": "Seifert", + "titel": "Prof. Dr." + }, + { + "vorname": "Matthias", + "nachname": "Krause" + }, + { + "vorname": "Giovanna", + "nachname": "Schwarz" + }, + { + "vorname": "Yusuf", + "nachname": "Weber" + }, + { + "vorname": "Patrick", + "nachname": "Kraus", + "titel": "Dr." + }, + { + "vorname": "Aylin", + "nachname": "Ludwig", + "titel": "Dr." + } + ] + }, + { + "name": "Lehrstuhl Messtechnik", + "personen": [ + { + "vorname": "Patrick", + "nachname": "Hoffmann", + "titel": "Prof. Dr." + }, + { + "vorname": "Marija", + "nachname": "Polat" + }, + { + "vorname": "Nadine", + "nachname": "Arnold" + }, + { + "vorname": "Marco", + "nachname": "Richter" + } + ] + }, + { + "name": "Doktorandenrunde Energietechnik", + "personen": [ + { + "vorname": "Dragana", + "nachname": "Dietrich", + "titel": "Prof. Dr." + }, + { + "vorname": "Michael", + "nachname": "Aksoy", + "titel": "Dr." + }, + { + "vorname": "Katrin", + "nachname": "Werner" + }, + { + "vorname": "Patrick", + "nachname": "Busch" + }, + { + "vorname": "Emre", + "nachname": "Hoffmann" + }, + { + "vorname": "Sergej", + "nachname": "Lange" + } + ] + }, + { + "name": "Doktorandenrunde Robotik", + "personen": [ + { + "vorname": "Anja", + "nachname": "Richter", + "titel": "Prof. Dr." + }, + { + "vorname": "Jan", + "nachname": "Thiel", + "titel": "Dr." + }, + { + "vorname": "Thomas", + "nachname": "Sahin" + } + ] + }, + { + "name": "Familie Koch (Studierenden-Familie 17)", + "personen": [ + { + "vorname": "Sarah", + "nachname": "Koch" + }, + { + "vorname": "Jan", + "nachname": "Koch" + }, + { + "vorname": "Marie", + "nachname": "Koch" + }, + { + "vorname": "Emil", + "nachname": "Koch" + }, + { + "vorname": "Olga", + "nachname": "Koch" + }, + { + "vorname": "Michael", + "nachname": "Koch" + } + ] + }, + { + "name": "Emeriti-Stammtisch", + "personen": [ + { + "vorname": "Thomas", + "nachname": "Tran", + "titel": "Prof. Dr." + }, + { + "vorname": "Sergej", + "nachname": "Petrov" + }, + { + "vorname": "Kathrin", + "nachname": "Polat" + }, + { + "vorname": "Marija", + "nachname": "Aksoy" + } + ] + }, + { + "name": "Institut fuer Verfahrenstechnik", + "personen": [ + { + "vorname": "Sergej", + "nachname": "Ott", + "titel": "Prof. Dr." + }, + { + "vorname": "Dragana", + "nachname": "Bauer" + }, + { + "vorname": "Nicole", + "nachname": "Peters" + }, + { + "vorname": "Nicole", + "nachname": "Hansen", + "titel": "Dr." + }, + { + "vorname": "Thomas", + "nachname": "Krause" + }, + { + "vorname": "Patrick", + "nachname": "Haas" + } + ] + }, + { + "name": "Lehrstuhl Mechatronik", + "personen": [ + { + "vorname": "Timo", + "nachname": "Kaya", + "titel": "Prof. Dr." + }, + { + "vorname": "Sandra", + "nachname": "Demir", + "titel": "Dr." + } + ] + }, + { + "name": "Institut fuer Luftfahrttechnik", + "personen": [ + { + "vorname": "Yusuf", + "nachname": "Ott", + "titel": "Prof. Dr." + }, + { + "vorname": "Nadine", + "nachname": "Berger", + "titel": "Dr." + }, + { + "vorname": "Patrick", + "nachname": "Lehmann" + } + ] + }, + { + "name": "Familie Wagner (Studierenden-Familie 18)", + "personen": [ + { + "vorname": "Nicole", + "nachname": "Wagner" + }, + { + "vorname": "Marco", + "nachname": "Wagner" + }, + { + "vorname": "Sarah", + "nachname": "Wagner" + }, + { + "vorname": "Henry", + "nachname": "Wagner" + } + ] + }, + { + "name": "Familie Dietrich (Studierenden-Familie 19)", + "personen": [ + { + "vorname": "Jennifer", + "nachname": "Dietrich" + }, + { + "vorname": "Marco", + "nachname": "Dietrich" + }, + { + "vorname": "Sofia", + "nachname": "Dietrich" + } + ] + }, + { + "name": "Familie Thiel (Studierenden-Familie 20)", + "personen": [ + { + "vorname": "Julia", + "nachname": "Thiel" + }, + { + "vorname": "Yusuf", + "nachname": "Thiel" + }, + { + "vorname": "Christina", + "nachname": "Thiel" + } + ] + }, + { + "name": "Familie Schmitt (Studierenden-Familie 21)", + "personen": [ + { + "vorname": "Sarah", + "nachname": "Schmitt" + }, + { + "vorname": "Markus", + "nachname": "Schmitt" + }, + { + "vorname": "Sofia", + "nachname": "Schmitt" + } + ] + }, + { + "name": "Familie Hartmann (Studierenden-Familie 22)", + "personen": [ + { + "vorname": "Marija", + "nachname": "Hartmann" + }, + { + "vorname": "Thomas", + "nachname": "Hartmann" + }, + { + "vorname": "Olga", + "nachname": "Hartmann" + }, + { + "vorname": "Deniz", + "nachname": "Hartmann" + }, + { + "vorname": "Nadine", + "nachname": "Hartmann" + } + ] + }, + { + "name": "Familie Rossi (Studierenden-Familie 23)", + "personen": [ + { + "vorname": "Melanie", + "nachname": "Rossi" + }, + { + "vorname": "Luca", + "nachname": "Rossi" + }, + { + "vorname": "Emilia", + "nachname": "Rossi" + } + ] + }, + { + "name": "Familie Braun (Studierenden-Familie 24)", + "personen": [ + { + "vorname": "Julia", + "nachname": "Braun" + }, + { + "vorname": "Milan", + "nachname": "Braun" + }, + { + "vorname": "Nadine", + "nachname": "Braun" + }, + { + "vorname": "Jan", + "nachname": "Braun" + }, + { + "vorname": "Dragana", + "nachname": "Braun" + }, + { + "vorname": "Christian", + "nachname": "Braun" + } + ] + }, + { + "name": "Familie Zimmermann (Studierenden-Familie 25)", + "personen": [ + { + "vorname": "Svenja", + "nachname": "Zimmermann" + }, + { + "vorname": "Jan", + "nachname": "Zimmermann" + }, + { + "vorname": "Mia", + "nachname": "Zimmermann" + }, + { + "vorname": "Markus", + "nachname": "Zimmermann" + } + ] + }, + { + "name": "Familie Krause (Studierenden-Familie 26)", + "personen": [ + { + "vorname": "Julia", + "nachname": "Krause" + }, + { + "vorname": "Andreas", + "nachname": "Krause" + }, + { + "vorname": "Emma", + "nachname": "Krause" + }, + { + "vorname": "Arda", + "nachname": "Krause" + } + ] + }, + { + "name": "Familie Nowak (Studierenden-Familie 27)", + "personen": [ + { + "vorname": "Aylin", + "nachname": "Nowak" + }, + { + "vorname": "Markus", + "nachname": "Nowak" + }, + { + "vorname": "Lina", + "nachname": "Nowak" + }, + { + "vorname": "Noah", + "nachname": "Nowak" + }, + { + "vorname": "Kathrin", + "nachname": "Nowak" + }, + { + "vorname": "Felix", + "nachname": "Nowak" + } + ] + }, + { + "name": "Familie Horn (Studierenden-Familie 28)", + "personen": [ + { + "vorname": "Kathrin", + "nachname": "Horn" + }, + { + "vorname": "Michael", + "nachname": "Horn" + }, + { + "vorname": "Layla", + "nachname": "Horn" + }, + { + "vorname": "Leon", + "nachname": "Horn" + } + ] + }, + { + "name": "Familie Ott (Studierenden-Familie 29)", + "personen": [ + { + "vorname": "Melanie", + "nachname": "Ott" + }, + { + "vorname": "Daniel", + "nachname": "Ott" + }, + { + "vorname": "Olga", + "nachname": "Ott" + }, + { + "vorname": "Matthias", + "nachname": "Ott" + }, + { + "vorname": "Hannah", + "nachname": "Ott" + } + ] + }, + { + "name": "Familie Neumann (Studierenden-Familie 30)", + "personen": [ + { + "vorname": "Jennifer", + "nachname": "Neumann" + }, + { + "vorname": "Thomas", + "nachname": "Neumann" + }, + { + "vorname": "Lina", + "nachname": "Neumann" + }, + { + "vorname": "Matteo", + "nachname": "Neumann" + } + ] + }, + { + "name": "Familie Wolf (Studierenden-Familie 31)", + "personen": [ + { + "vorname": "Julia", + "nachname": "Wolf" + }, + { + "vorname": "Thomas", + "nachname": "Wolf" + }, + { + "vorname": "Emma", + "nachname": "Wolf" + }, + { + "vorname": "Ben", + "nachname": "Wolf" + } + ] + }, + { + "name": "Familie Aksoy (Studierenden-Familie 32)", + "personen": [ + { + "vorname": "Nadine", + "nachname": "Aksoy" + }, + { + "vorname": "Thomas", + "nachname": "Aksoy" + }, + { + "vorname": "Marie", + "nachname": "Aksoy" + }, + { + "vorname": "Luca", + "nachname": "Aksoy" + }, + { + "vorname": "Sofia", + "nachname": "Aksoy" + }, + { + "vorname": "Sergej", + "nachname": "Aksoy" + } + ] + }, + { + "name": "Familie Hansen (Studierenden-Familie 33)", + "personen": [ + { + "vorname": "Giovanna", + "nachname": "Hansen" + }, + { + "vorname": "Markus", + "nachname": "Hansen" + }, + { + "vorname": "Olga", + "nachname": "Hansen" + } + ] + }, + { + "name": "Familie Polat (Studierenden-Familie 34)", + "personen": [ + { + "vorname": "Stefanie", + "nachname": "Polat" + }, + { + "vorname": "Stefan", + "nachname": "Polat" + }, + { + "vorname": "Sarah", + "nachname": "Polat" + }, + { + "vorname": "Markus", + "nachname": "Polat" + }, + { + "vorname": "Katrin", + "nachname": "Polat" + } + ] + }, + { + "name": "Familie Franke (Studierenden-Familie 35)", + "personen": [ + { + "vorname": "Olga", + "nachname": "Franke" + }, + { + "vorname": "Marco", + "nachname": "Franke" + }, + { + "vorname": "Amira", + "nachname": "Franke" + }, + { + "vorname": "Michael", + "nachname": "Franke" + }, + { + "vorname": "Julia", + "nachname": "Franke" + } + ] + }, + { + "name": "Familie Kovac (Studierenden-Familie 36)", + "personen": [ + { + "vorname": "Lena", + "nachname": "Kovac" + }, + { + "vorname": "Tobias", + "nachname": "Kovac" + }, + { + "vorname": "Marija", + "nachname": "Kovac" + }, + { + "vorname": "Marco", + "nachname": "Kovac" + }, + { + "vorname": "Anja", + "nachname": "Kovac" + }, + { + "vorname": "Henry", + "nachname": "Kovac" + } + ] + }, + { + "name": "Familie Winkler (Studierenden-Familie 37)", + "personen": [ + { + "vorname": "Lena", + "nachname": "Winkler" + }, + { + "vorname": "Patrick", + "nachname": "Winkler" + } + ] + }, + { + "name": "Familie Petrov (Studierenden-Familie 38)", + "personen": [ + { + "vorname": "Kathrin", + "nachname": "Petrov" + }, + { + "vorname": "Milan", + "nachname": "Petrov" + } + ] + }, + { + "name": "Familie Stein (Studierenden-Familie 39)", + "personen": [ + { + "vorname": "Giovanna", + "nachname": "Stein" + }, + { + "vorname": "Thomas", + "nachname": "Stein" + }, + { + "vorname": "Emilia", + "nachname": "Stein" + }, + { + "vorname": "Ben", + "nachname": "Stein" + } + ] + }, + { + "name": "Familie Pohl (Studierenden-Familie 40)", + "personen": [ + { + "vorname": "Dragana", + "nachname": "Pohl" + }, + { + "vorname": "Emre", + "nachname": "Pohl" + }, + { + "vorname": "Mia", + "nachname": "Pohl" + }, + { + "vorname": "Theo", + "nachname": "Pohl" + } + ] + }, + { + "name": "Familie Berger (Studierenden-Familie 41)", + "personen": [ + { + "vorname": "Svenja", + "nachname": "Berger" + }, + { + "vorname": "Andreas", + "nachname": "Berger" + }, + { + "vorname": "Jennifer", + "nachname": "Berger" + }, + { + "vorname": "Anton", + "nachname": "Berger" + }, + { + "vorname": "Layla", + "nachname": "Berger" + }, + { + "vorname": "Stefan", + "nachname": "Berger" + } + ] + }, + { + "name": "Familie Barth (Studierenden-Familie 42)", + "personen": [ + { + "vorname": "Nadine", + "nachname": "Barth" + }, + { + "vorname": "Timo", + "nachname": "Barth" + }, + { + "vorname": "Lina", + "nachname": "Barth" + }, + { + "vorname": "Patrick", + "nachname": "Barth" + } + ] + }, + { + "name": "Familie Simon (Studierenden-Familie 43)", + "personen": [ + { + "vorname": "Lena", + "nachname": "Simon" + }, + { + "vorname": "Markus", + "nachname": "Simon" + }, + { + "vorname": "Emma", + "nachname": "Simon" + }, + { + "vorname": "Andreas", + "nachname": "Simon" + } + ] + }, + { + "name": "Familie Lange (Studierenden-Familie 44)", + "personen": [ + { + "vorname": "Dragana", + "nachname": "Lange" + }, + { + "vorname": "Michael", + "nachname": "Lange" + }, + { + "vorname": "Sofia", + "nachname": "Lange" + }, + { + "vorname": "Jan", + "nachname": "Lange" + }, + { + "vorname": "Svenja", + "nachname": "Lange" + } + ] + }, + { + "name": "Familie Lehmann (Studierenden-Familie 45)", + "personen": [ + { + "vorname": "Giovanna", + "nachname": "Lehmann" + }, + { + "vorname": "Milan", + "nachname": "Lehmann" + }, + { + "vorname": "Layla", + "nachname": "Lehmann" + }, + { + "vorname": "Thomas", + "nachname": "Lehmann" + }, + { + "vorname": "Nicole", + "nachname": "Lehmann" + }, + { + "vorname": "Markus", + "nachname": "Lehmann" + } + ] + }, + { + "name": "Familie Maier (Studierenden-Familie 46)", + "personen": [ + { + "vorname": "Sarah", + "nachname": "Maier" + }, + { + "vorname": "Christian", + "nachname": "Maier" + }, + { + "vorname": "Olga", + "nachname": "Maier" + }, + { + "vorname": "Arda", + "nachname": "Maier" + } + ] + }, + { + "name": "Familie Sahin (Studierenden-Familie 47)", + "personen": [ + { + "vorname": "Nicole", + "nachname": "Sahin" + }, + { + "vorname": "Markus", + "nachname": "Sahin" + }, + { + "vorname": "Kathrin", + "nachname": "Sahin" + }, + { + "vorname": "Patrick", + "nachname": "Sahin" + } + ] + }, + { + "name": "Familie Ludwig (Studierenden-Familie 48)", + "personen": [ + { + "vorname": "Giovanna", + "nachname": "Ludwig" + }, + { + "vorname": "Emre", + "nachname": "Ludwig" + }, + { + "vorname": "Elif", + "nachname": "Ludwig" + }, + { + "vorname": "Elias", + "nachname": "Ludwig" + } + ] + }, + { + "name": "Familie Weber (Studierenden-Familie 49)", + "personen": [ + { + "vorname": "Julia", + "nachname": "Weber" + } + ] + } + ] +} \ No newline at end of file diff --git a/work/innenhoefe/bestellung.xml b/work/innenhoefe/bestellung.xml deleted file mode 100644 index a08300b..0000000 --- a/work/innenhoefe/bestellung.xml +++ /dev/null @@ -1,1541 +0,0 @@ - - - - - - - - Alexander - Grothe - Dr. h.c. - - - Beate - Grothe - - - Ferdinand - Kessler - Dr. - - - Viktoria - Kessler - - 5 - - - - - - Konstantin - Freiherr von Waldeck - Dr. - - - Antonia - Freifrau von Waldeck - - - Georg - Steinbach - - - Elisabeth - Steinbach - - 6 - - - - - - Heinrich - Dallmann - - - Margarete - Dallmann - - - Maximilian - Dallmann - - - Charlotte - Dallmann - - 7 - - - - - - Sandra - Bianchi - - - Thomas - Bianchi - - - Mia - Bianchi - - - - - - - Jennifer - Arnold - - - Patrick - Arnold - - - Leni - Arnold - - - Christian - Arnold - - - Mila - Arnold - - - - - - - Nicole - Seifert - - - Yusuf - Seifert - - - Leni - Seifert - - - Timo - Seifert - - - Elif - Seifert - - - - - - - Sarah - Albrecht - - - Andreas - Albrecht - - - - - - - Yusuf - Esposito - Prof. Dr. - - - Marija - Becker - - - Matthias - Kovac - - - - - - - Nicole - Kaya - - - Luca - Kaya - - - Christina - Kaya - - - - - - - Julia - Richter - Prof. Dr. - - - Jennifer - Haas - Dr. - - - Markus - Barth - - - Matthias - Petrov - - - Andreas - Weber - - - - - - - Giovanna - Schmidt - - - Matthias - Schmidt - - - Marie - Schmidt - - - - - - - Anja - Richter - - - Matthias - Richter - - - Greta - Richter - - - Anton - Richter - - - - - - - Emre - Albrecht - Prof. Dr. - - - Thomas - Bianchi - - - Olga - Roth - - - Olga - Klein - Dr. - - - Jennifer - Arnold - Dr. - - - - - - - Dennis - Werner - Prof. Dr. - - - Thomas - Hoffmann - Dr. - - - Olga - Tran - - - Anja - Seidel - Dr. - - - - - - - Markus - Stein - Prof. Dr. - - - Matthias - Popescu - - - - - - - Yusuf - Albrecht - Prof. Dr. - - - Svenja - Simon - - - - - - - Julia - Roth - Prof. Dr. - - - Thomas - Hansen - - - Nicole - Schmidt - - - Julia - Nguyen - - - Stefanie - Seifert - Dr. - - - Thomas - Winkler - - - Jan - Esposito - Dr. - - - - - - - Nicole - Becker - - - Jan - Becker - - - Sandra - Becker - - - - - - - Kathrin - Petrov - Prof. Dr. - - - Markus - Seidel - Dr. - - - Markus - Kraus - - - Giovanna - Petrov - - - Nadine - Stein - Dr. - - - Markus - Schmitt - - - Christian - Peters - - - - - - - Anja - Nguyen - - - Daniel - Nguyen - - - Sofia - Nguyen - - - - - - - Elif - Celik - - - Patrick - Celik - - - - - - - Stefanie - Klein - - - Milan - Klein - - - Lina - Klein - - - - - - - Olga - Busch - - - Emre - Busch - - - Marie - Busch - - - Michael - Busch - - - - - - - Stefan - Schmitt - Prof. Dr. - - - Marija - Tran - - - Kathrin - Koch - Dr. - - - Julia - Kuhn - Dr. - - - Katrin - Weber - - - Luca - Werner - - - - - - - Anja - Engel - - - Yusuf - Engel - - - Julia - Engel - - - Anton - Engel - - - Nicole - Engel - - - - - - - Emre - Ludwig - Prof. Dr. - - - Daniel - Krause - - - Nicole - Aksoy - - - Markus - Klein - - - - - - - Dennis - Schmitt - Prof. Dr. - - - Luca - Kovac - - - Dragana - Krause - Dr. - - - Luca - Ott - - - Patrick - Zimmermann - - - Stefan - Richter - - - - - - - Yusuf - Seidel - Prof. Dr. - - - Yusuf - Bauer - - - Jan - Bianchi - Dr. - - - Marco - Winkler - - - Emre - Klein - - - Patrick - Kaya - Dr. - - - Christina - Krause - Dr. - - - - - - - Nadine - Frank - - - Dennis - Frank - - - Marie - Frank - - - Finn - Frank - - - Lena - Frank - - - - - - - Sandra - Werner - - - Andreas - Werner - - - Nadine - Werner - - - Marco - Werner - - - - - - - Sarah - Roth - - - Christian - Roth - - - Sofia - Roth - - - - - - - Marco - Seifert - Prof. Dr. - - - Matthias - Krause - - - Giovanna - Schwarz - - - Yusuf - Weber - - - Patrick - Kraus - Dr. - - - Aylin - Ludwig - Dr. - - - - - - - Patrick - Hoffmann - Prof. Dr. - - - Marija - Polat - - - Nadine - Arnold - - - Marco - Richter - - - - - - - Dragana - Dietrich - Prof. Dr. - - - Michael - Aksoy - Dr. - - - Katrin - Werner - - - Patrick - Busch - - - Emre - Hoffmann - - - Sergej - Lange - - - - - - - Anja - Richter - Prof. Dr. - - - Jan - Thiel - Dr. - - - Thomas - Sahin - - - - - - - Sarah - Koch - - - Jan - Koch - - - Marie - Koch - - - Emil - Koch - - - Olga - Koch - - - Michael - Koch - - - - - - - Thomas - Tran - Prof. Dr. - - - Sergej - Petrov - - - Kathrin - Polat - - - Marija - Aksoy - - - - - - - Sergej - Ott - Prof. Dr. - - - Dragana - Bauer - - - Nicole - Peters - - - Nicole - Hansen - Dr. - - - Thomas - Krause - - - Patrick - Haas - - - - - - - Timo - Kaya - Prof. Dr. - - - Sandra - Demir - Dr. - - - - - - - Yusuf - Ott - Prof. Dr. - - - Nadine - Berger - Dr. - - - Patrick - Lehmann - - - - - - - Nicole - Wagner - - - Marco - Wagner - - - Sarah - Wagner - - - Henry - Wagner - - - - - - - Jennifer - Dietrich - - - Marco - Dietrich - - - Sofia - Dietrich - - - - - - - Julia - Thiel - - - Yusuf - Thiel - - - Christina - Thiel - - - - - - - Sarah - Schmitt - - - Markus - Schmitt - - - Sofia - Schmitt - - - - - - - Marija - Hartmann - - - Thomas - Hartmann - - - Olga - Hartmann - - - Deniz - Hartmann - - - Nadine - Hartmann - - - - - - - Melanie - Rossi - - - Luca - Rossi - - - Emilia - Rossi - - - - - - - Julia - Braun - - - Milan - Braun - - - Nadine - Braun - - - Jan - Braun - - - Dragana - Braun - - - Christian - Braun - - - - - - - Svenja - Zimmermann - - - Jan - Zimmermann - - - Mia - Zimmermann - - - Markus - Zimmermann - - - - - - - Julia - Krause - - - Andreas - Krause - - - Emma - Krause - - - Arda - Krause - - - - - - - Aylin - Nowak - - - Markus - Nowak - - - Lina - Nowak - - - Noah - Nowak - - - Kathrin - Nowak - - - Felix - Nowak - - - - - - - Kathrin - Horn - - - Michael - Horn - - - Layla - Horn - - - Leon - Horn - - - - - - - Melanie - Ott - - - Daniel - Ott - - - Olga - Ott - - - Matthias - Ott - - - Hannah - Ott - - - - - - - Jennifer - Neumann - - - Thomas - Neumann - - - Lina - Neumann - - - Matteo - Neumann - - - - - - - Julia - Wolf - - - Thomas - Wolf - - - Emma - Wolf - - - Ben - Wolf - - - - - - - Nadine - Aksoy - - - Thomas - Aksoy - - - Marie - Aksoy - - - Luca - Aksoy - - - Sofia - Aksoy - - - Sergej - Aksoy - - - - - - - Giovanna - Hansen - - - Markus - Hansen - - - Olga - Hansen - - - - - - - Stefanie - Polat - - - Stefan - Polat - - - Sarah - Polat - - - Markus - Polat - - - Katrin - Polat - - - - - - - Olga - Franke - - - Marco - Franke - - - Amira - Franke - - - Michael - Franke - - - Julia - Franke - - - - - - - Lena - Kovac - - - Tobias - Kovac - - - Marija - Kovac - - - Marco - Kovac - - - Anja - Kovac - - - Henry - Kovac - - - - - - - Lena - Winkler - - - Patrick - Winkler - - - - - - - Kathrin - Petrov - - - Milan - Petrov - - - - - - - Giovanna - Stein - - - Thomas - Stein - - - Emilia - Stein - - - Ben - Stein - - - - - - - Dragana - Pohl - - - Emre - Pohl - - - Mia - Pohl - - - Theo - Pohl - - - - - - - Svenja - Berger - - - Andreas - Berger - - - Jennifer - Berger - - - Anton - Berger - - - Layla - Berger - - - Stefan - Berger - - - - - - - Nadine - Barth - - - Timo - Barth - - - Lina - Barth - - - Patrick - Barth - - - - - - - Lena - Simon - - - Markus - Simon - - - Emma - Simon - - - Andreas - Simon - - - - - - - Dragana - Lange - - - Michael - Lange - - - Sofia - Lange - - - Jan - Lange - - - Svenja - Lange - - - - - - - Giovanna - Lehmann - - - Milan - Lehmann - - - Layla - Lehmann - - - Thomas - Lehmann - - - Nicole - Lehmann - - - Markus - Lehmann - - - - - - - Sarah - Maier - - - Christian - Maier - - - Olga - Maier - - - Arda - Maier - - - - - - - Nicole - Sahin - - - Markus - Sahin - - - Kathrin - Sahin - - - Patrick - Sahin - - - - - - - Giovanna - Ludwig - - - Emre - Ludwig - - - Elif - Ludwig - - - Elias - Ludwig - - - - - - - Julia - Weber - - - - diff --git a/work/test1/PersonenTische.csv b/work/test1/PersonenTische.csv index 29b5469..5086f57 100644 --- a/work/test1/PersonenTische.csv +++ b/work/test1/PersonenTische.csv @@ -1,19 +1,19 @@ -AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 2 -AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 3 -AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 4 -AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 5 -AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 6 -AA, A, Dipl. Ing. = Hof 1, Tisch 2, Nummer 2 -AA, A, Dipl. Ing. = Hof 1, Tisch 2, Nummer 3 -AA, A, Dipl. Ing. = Hof 1, Tisch 2, Nummer 4 -AA, A, Dipl. Ing. = Hof 1, Tisch 2, Nummer 5 -AA, A, Dipl. Ing. = Hof 1, Tisch 2, Nummer 6 -BB, B, Prof. = Hof 1, Tisch 3, Nummer 2 -BB, B, Prof. = Hof 1, Tisch 3, Nummer 3 -BB, B, Prof. = Hof 1, Tisch 3, Nummer 4 -BB, B, Prof. = Hof 1, Tisch 3, Nummer 5 -CC, C, Dr. = Hof 1, Tisch 4, Nummer 2 -CC, C, Dr. = Hof 1, Tisch 4, Nummer 3 -CC, C, Dr. = Hof 1, Tisch 4, Nummer 4 -CC, C, Dr. = Hof 1, Tisch 4, Nummer 5 -CC, C, Dr. = Hof 1, Tisch 4, Nummer 6 +AA, A, Dipl. Ing. = Hof 1, Tisch 3, Nummer 2 +AA, A, Dipl. Ing. = Hof 1, Tisch 3, Nummer 3 +AA, A, Dipl. Ing. = Hof 1, Tisch 3, Nummer 4 +AA, A, Dipl. Ing. = Hof 1, Tisch 3, Nummer 5 +AA, A, Dipl. Ing. = Hof 1, Tisch 3, Nummer 6 +AA, A, Dipl. Ing. = Hof 1, Tisch 4, Nummer 2 +AA, A, Dipl. Ing. = Hof 1, Tisch 4, Nummer 3 +AA, A, Dipl. Ing. = Hof 1, Tisch 4, Nummer 4 +AA, A, Dipl. Ing. = Hof 1, Tisch 4, Nummer 5 +AA, A, Dipl. Ing. = Hof 1, Tisch 4, Nummer 6 +BB, B, Prof. = Hof 1, Tisch 1, Nummer 2 +BB, B, Prof. = Hof 1, Tisch 1, Nummer 3 +BB, B, Prof. = Hof 1, Tisch 1, Nummer 4 +BB, B, Prof. = Hof 1, Tisch 1, Nummer 5 +CC, C, Dr. = Hof 1, Tisch 2, Nummer 2 +CC, C, Dr. = Hof 1, Tisch 2, Nummer 3 +CC, C, Dr. = Hof 1, Tisch 2, Nummer 4 +CC, C, Dr. = Hof 1, Tisch 2, Nummer 5 +CC, C, Dr. = Hof 1, Tisch 2, Nummer 6 diff --git a/work/test1/Sitzplatzverteilung.svg b/work/test1/Sitzplatzverteilung.svg new file mode 100644 index 0000000..bffb24a --- /dev/null +++ b/work/test1/Sitzplatzverteilung.svg @@ -0,0 +1,35 @@ + + + + + + + + + +3 + + + + + + + +1 + + + + + + + +2 + + + + + + + +4 + diff --git a/work/test1/TischePersonen.txt b/work/test1/TischePersonen.txt index 2d21859..1006d0d 100644 --- a/work/test1/TischePersonen.txt +++ b/work/test1/TischePersonen.txt @@ -1,27 +1,27 @@ [1] -Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 1 -Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 2 -Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 3 -Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 4 -Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 5 +Prof. B BB = Hof 1, Tisch 1, Nummer 1 +Prof. B BB = Hof 1, Tisch 1, Nummer 2 +Prof. B BB = Hof 1, Tisch 1, Nummer 3 +Prof. B BB = Hof 1, Tisch 1, Nummer 4 [2] -Dipl. Ing. A AA = Hof 1, Tisch 2, Nummer 1 -Dipl. Ing. A AA = Hof 1, Tisch 2, Nummer 2 -Dipl. Ing. A AA = Hof 1, Tisch 2, Nummer 3 -Dipl. Ing. A AA = Hof 1, Tisch 2, Nummer 4 -Dipl. Ing. A AA = Hof 1, Tisch 2, Nummer 5 +Dr. C CC = Hof 1, Tisch 2, Nummer 1 +Dr. C CC = Hof 1, Tisch 2, Nummer 2 +Dr. C CC = Hof 1, Tisch 2, Nummer 3 +Dr. C CC = Hof 1, Tisch 2, Nummer 4 +Dr. C CC = Hof 1, Tisch 2, Nummer 5 [3] -Prof. B BB = Hof 1, Tisch 3, Nummer 1 -Prof. B BB = Hof 1, Tisch 3, Nummer 2 -Prof. B BB = Hof 1, Tisch 3, Nummer 3 -Prof. B BB = Hof 1, Tisch 3, Nummer 4 +Dipl. Ing. A AA = Hof 1, Tisch 3, Nummer 1 +Dipl. Ing. A AA = Hof 1, Tisch 3, Nummer 2 +Dipl. Ing. A AA = Hof 1, Tisch 3, Nummer 3 +Dipl. Ing. A AA = Hof 1, Tisch 3, Nummer 4 +Dipl. Ing. A AA = Hof 1, Tisch 3, Nummer 5 [4] -Dr. C CC = Hof 1, Tisch 4, Nummer 1 -Dr. C CC = Hof 1, Tisch 4, Nummer 2 -Dr. C CC = Hof 1, Tisch 4, Nummer 3 -Dr. C CC = Hof 1, Tisch 4, Nummer 4 -Dr. C CC = Hof 1, Tisch 4, Nummer 5 +Dipl. Ing. A AA = Hof 1, Tisch 4, Nummer 1 +Dipl. Ing. A AA = Hof 1, Tisch 4, Nummer 2 +Dipl. Ing. A AA = Hof 1, Tisch 4, Nummer 3 +Dipl. Ing. A AA = Hof 1, Tisch 4, Nummer 4 +Dipl. Ing. A AA = Hof 1, Tisch 4, Nummer 5 diff --git a/work/test1/bestellung.json b/work/test1/bestellung.json new file mode 100644 index 0000000..5e50277 --- /dev/null +++ b/work/test1/bestellung.json @@ -0,0 +1,34 @@ +{ + "gruppen": [ + { + "anzahl": 10, + "personen": [ + { + "vorname": "A", + "nachname": "AA", + "titel": "Dipl. Ing." + } + ] + }, + { + "anzahl": 4, + "personen": [ + { + "vorname": "B", + "nachname": "BB", + "titel": "Prof." + } + ] + }, + { + "anzahl": 5, + "personen": [ + { + "vorname": "C", + "nachname": "CC", + "titel": "Dr." + } + ] + } + ] +} \ No newline at end of file diff --git a/work/test1/bestellung.xml b/work/test1/bestellung.xml deleted file mode 100755 index e4cc7de..0000000 --- a/work/test1/bestellung.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - A - AA - Dipl. Ing. - - 10 - - - - - B - BB - Prof. - - 4 - - - - - C - CC - Dr. - - 5 - - - - - diff --git a/work/test2/Entwicklung.svg b/work/test2/Entwicklung.svg new file mode 100644 index 0000000..dc99560 --- /dev/null +++ b/work/test2/Entwicklung.svg @@ -0,0 +1,47 @@ + + + +Entwicklung der Loesungsfindung + + + +-76 + +-62 + +-48 + +-34 + +-20 + +-6 +Wertigkeit (hoeher = besser) +Zyklus-Aktion (Zeit) +e +s +z +m +j +z +s +z +m +j +z +s +z +m +j +z +s + + + + +beste Loesung + +Durchschnitt + +schlechteste Loesung + diff --git a/work/test2/PersonenTische.csv b/work/test2/PersonenTische.csv new file mode 100644 index 0000000..f4f0ef2 --- /dev/null +++ b/work/test2/PersonenTische.csv @@ -0,0 +1,17 @@ +Bloedkopf, Bestelli, = Hof 1, Tisch 3, Nummer 2 +Bloedkopf, Bestelli, = Hof 1, Tisch 3, Nummer 3 +Bloedkopf, Bestelli, = Hof 1, Tisch 3, Nummer 4 +Brandt, Willi, Dr. = Hof 1, Tisch 4, Nummer 2 +Bruegge, Heinz, = Hof 1, Tisch 5, Nummer 5 +Dietrich, Marlene, = Hof 1, Tisch 5, Nummer 3 +Emmerlich, Walter, = Hof 1, Tisch 4, Nummer 3 +Frenzen, Heinz Harald, = Hof 1, Tisch 4, Nummer 4 +Hoehn, Bernd Robert, Professor = Hof 1, Tisch 1, Nummer 4 +Junke, Harald, = Hof 1, Tisch 2, Nummer 2 +K, Hubert, = Hof 1, Tisch 5, Nummer 4 +Leone, Sergio, = Hof 1, Tisch 2, Nummer 4 +Mueller, Magnus, Professor = Hof 1, Tisch 1, Nummer 2 +Ruehmann, Heinz, = Hof 1, Tisch 5, Nummer 2 +Schumacher, Michael, = Hof 1, Tisch 2, Nummer 3 +Schumacher, Ralf, = Hof 1, Tisch 4, Nummer 5 +Stangl, Michael, Dipl. Ing. = Hof 1, Tisch 1, Nummer 3 diff --git a/work/test2/Sitzplatzverteilung.svg b/work/test2/Sitzplatzverteilung.svg new file mode 100644 index 0000000..196417d --- /dev/null +++ b/work/test2/Sitzplatzverteilung.svg @@ -0,0 +1,36 @@ + + + + + + + + +1 + + + + + +2 + + + + + +3 + + + + + + +4 + + + + + + +5 + diff --git a/work/test2/TischePersonen.txt b/work/test2/TischePersonen.txt new file mode 100644 index 0000000..e45ff37 --- /dev/null +++ b/work/test2/TischePersonen.txt @@ -0,0 +1,27 @@ +[1] +Professor Magnus Mueller = Hof 1, Tisch 1, Nummer 1 +Dipl. Ing. Michael Stangl = Hof 1, Tisch 1, Nummer 2 +Professor Bernd Robert Hoehn = Hof 1, Tisch 1, Nummer 3 + +[2] + Harald Junke = Hof 1, Tisch 2, Nummer 1 + Michael Schumacher = Hof 1, Tisch 2, Nummer 2 + Sergio Leone = Hof 1, Tisch 2, Nummer 3 + +[3] + Bestelli Bloedkopf = Hof 1, Tisch 3, Nummer 1 + Bestelli Bloedkopf = Hof 1, Tisch 3, Nummer 2 + Bestelli Bloedkopf = Hof 1, Tisch 3, Nummer 3 + +[4] +Dr. Willi Brandt = Hof 1, Tisch 4, Nummer 1 + Walter Emmerlich = Hof 1, Tisch 4, Nummer 2 + Heinz Harald Frenzen = Hof 1, Tisch 4, Nummer 3 + Ralf Schumacher = Hof 1, Tisch 4, Nummer 4 + +[5] + Heinz Ruehmann = Hof 1, Tisch 5, Nummer 1 + Marlene Dietrich = Hof 1, Tisch 5, Nummer 2 + Hubert K = Hof 1, Tisch 5, Nummer 3 + Heinz Bruegge = Hof 1, Tisch 5, Nummer 4 + diff --git a/work/test2/bestellung.json b/work/test2/bestellung.json new file mode 100644 index 0000000..88ecaee --- /dev/null +++ b/work/test2/bestellung.json @@ -0,0 +1,93 @@ +{ + "gruppen": [ + { + "name": "einfache Gruppe aus drei Personen\n\t mit festem Wunsch fuer einen Tisch", + "tisch": 1, + "personen": [ + { + "vorname": "Michael", + "nachname": "Stangl", + "titel": "Dipl. Ing." + }, + { + "vorname": "Magnus", + "nachname": "Mueller", + "titel": "Professor" + }, + { + "vorname": "Bernd Robert", + "nachname": "Hoehn", + "titel": "Professor" + } + ] + }, + { + "name": "einfache Gruppe aus zwei Personen", + "personen": [ + { + "vorname": "Heinz", + "nachname": "Bruegge" + }, + { + "vorname": "Hubert", + "nachname": "K" + } + ] + }, + { + "personen": [ + { + "vorname": "Heinz", + "nachname": "Ruehmann" + }, + { + "vorname": "Marlene", + "nachname": "Dietrich" + } + ] + }, + { + "personen": [ + { + "vorname": "Sergio", + "nachname": "Leone" + }, + { + "vorname": "Walter", + "nachname": "Emmerlich" + }, + { + "vorname": "Harald", + "nachname": "Junke" + }, + { + "vorname": "Willi", + "nachname": "Brandt", + "titel": "Dr." + }, + { + "vorname": "Michael", + "nachname": "Schumacher" + }, + { + "vorname": "Ralf", + "nachname": "Schumacher" + }, + { + "vorname": "Heinz Harald", + "nachname": "Frenzen" + } + ] + }, + { + "name": "Gruppe aus drei anonymen Personen", + "anzahl": 3, + "personen": [ + { + "vorname": "Bestelli", + "nachname": "Bloedkopf" + } + ] + } + ] +} \ No newline at end of file diff --git a/work/test2/bestellung.xml b/work/test2/bestellung.xml deleted file mode 100755 index 2ee9577..0000000 --- a/work/test2/bestellung.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - Michael - Stangl - Dipl. Ing. - - - Magnus - Mueller - Professor - - - Bernd Robert - Hoehn - Professor - - 1 - - - - - - Heinz - Bruegge - - - Hubert - K - - - - - - Heinz - Ruehmann - - - Marlene - Dietrich - - - - - - Sergio - Leone - - - Walter - Emmerlich - - - Harald - Junke - - - Willi - Brandt - Dr. - - - Michael - Schumacher - - - Ralf - Schumacher - - - Heinz Harald - Frenzen - - - - - - - Bestelli - Bloedkopf - - 3 - - - - -