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:
@@ -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
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
@update:newClassMinBirthYear="$emit('update:newClassMinBirthYear', $event)"
|
||||
/>
|
||||
|
||||
<div class="stage-config" style="margin-top: 1.5rem;">
|
||||
<div v-if="!isMiniChampionship" class="stage-config" style="margin-top: 1.5rem;">
|
||||
<h3>Zwischenrunde & Endrunde</h3>
|
||||
<div v-if="stageConfig.loading" style="opacity: 0.8;">
|
||||
Lade Zwischenrunden …
|
||||
@@ -224,6 +224,10 @@ export default {
|
||||
type: Boolean,
|
||||
required: true
|
||||
},
|
||||
isMiniChampionship: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
tournamentClasses: {
|
||||
type: Array,
|
||||
required: true
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
:club-id="currentClub"
|
||||
:tournament-id="selectedDate"
|
||||
:tournament-name="currentTournamentName"
|
||||
:is-mini-championship="isMiniChampionship"
|
||||
:tournament-date="currentTournamentDate"
|
||||
:winning-sets="currentWinningSets"
|
||||
:is-group-tournament="isGroupTournament"
|
||||
|
||||
Reference in New Issue
Block a user