feat(tournament): refine mini championship creation and UI integration

- Updated the addMiniChampionship method to default winning sets to 1 and added transaction handling for improved reliability.
- Enhanced frontend components to include a new property for mini championship identification, ensuring proper configuration in the UI.
- Adjusted the display logic in TournamentConfigTab to conditionally render stage configuration based on the mini championship type.
This commit is contained in:
Torsten Schulz (local)
2026-01-30 23:09:21 +01:00
parent 025ad68cf3
commit 14dc654145
3 changed files with 48 additions and 33 deletions

View File

@@ -718,8 +718,9 @@ class TournamentService {
* Minimeisterschaft anlegen: Turnier + 6 vorkonfigurierte Klassen (Jungen/Mädchen 12, 10, 8).
* Name wird generiert: "Minimeisterschaften <Jahr> Ortsentscheid <ort>".
* Jahr Y: 12 = in Y 11 oder 12 Jahre (Geburtsjahr Y-12 oder Y-11), 10 = 9/10 (Y-10, Y-9), 8 = 8 oder jünger (≥ Y-8).
* Standard-Gewinnsätze: 1.
*/
async addMiniChampionship(userToken, clubId, ort, date, year, winningSets = 3) {
async addMiniChampionship(userToken, clubId, ort, date, year, winningSets = 1) {
await checkAccess(userToken, clubId);
const ortTrimmed = (ort || '').trim();
if (!ortTrimmed) {
@@ -734,38 +735,47 @@ class TournamentService {
throw new Error('Ungültiges Jahr für die Minimeisterschaft');
}
const tournamentName = `Minimeisterschaften ${Y} Ortsentscheid ${ortTrimmed}`;
const t = await Tournament.create({
name: tournamentName,
date,
clubId: +clubId,
bestOfEndroundSize: 0,
type: '',
winningSets: winningSets || 3,
allowsExternal: false,
miniChampionshipYear: Y
});
const classes = [
{ name: 'Jungen 12', gender: 'male', minBirthYear: Y - 12, maxBirthYear: Y - 11 },
{ name: 'Jungen 10', gender: 'male', minBirthYear: Y - 10, maxBirthYear: Y - 9 },
{ name: 'Jungen 8', gender: 'male', minBirthYear: Y - 8, maxBirthYear: null },
{ name: 'Mädchen 12', gender: 'female', minBirthYear: Y - 12, maxBirthYear: Y - 11 },
{ name: 'Mädchen 10', gender: 'female', minBirthYear: Y - 10, maxBirthYear: Y - 9 },
{ name: 'Mädchen 8', gender: 'female', minBirthYear: Y - 8, maxBirthYear: null },
];
for (let i = 0; i < classes.length; i++) {
await TournamentClass.create({
tournamentId: t.id,
name: classes[i].name,
sortOrder: i + 1,
isDoubles: false,
gender: classes[i].gender,
minBirthYear: classes[i].minBirthYear,
maxBirthYear: classes[i].maxBirthYear
});
const sets = (winningSets != null && winningSets >= 1) ? Number(winningSets) : 1;
const transaction = await Tournament.sequelize.transaction();
try {
const t = await Tournament.create({
name: tournamentName,
date,
clubId: +clubId,
type: '',
winningSets: sets,
allowsExternal: false,
miniChampionshipYear: Y
}, { transaction });
const classes = [
{ name: 'Jungen 12', gender: 'male', minBirthYear: Y - 12, maxBirthYear: Y - 11 },
{ name: 'Jungen 10', gender: 'male', minBirthYear: Y - 10, maxBirthYear: Y - 9 },
{ name: 'Jungen 8', gender: 'male', minBirthYear: Y - 8, maxBirthYear: null },
{ name: 'Mädchen 12', gender: 'female', minBirthYear: Y - 12, maxBirthYear: Y - 11 },
{ name: 'Mädchen 10', gender: 'female', minBirthYear: Y - 10, maxBirthYear: Y - 9 },
{ name: 'Mädchen 8', gender: 'female', minBirthYear: Y - 8, maxBirthYear: null },
];
for (let i = 0; i < classes.length; i++) {
await TournamentClass.create({
tournamentId: t.id,
name: classes[i].name,
sortOrder: i + 1,
isDoubles: false,
gender: classes[i].gender,
minBirthYear: classes[i].minBirthYear,
maxBirthYear: classes[i].maxBirthYear
}, { transaction });
}
await transaction.commit();
return JSON.parse(JSON.stringify(await Tournament.findByPk(t.id, {
attributes: ['id', 'name', 'date', 'allowsExternal', 'miniChampionshipYear']
})));
} catch (err) {
await transaction.rollback();
throw err;
}
return JSON.parse(JSON.stringify(await Tournament.findByPk(t.id, {
attributes: ['id', 'name', 'date', 'allowsExternal', 'miniChampionshipYear']
})));
}
// 3. Teilnehmer hinzufügen (kein Duplikat) - klassengebunden