Entries Governor
import { entriesGovernor } from 'tods-competition-factory';
addDrawEntries
Bulk add an array of participantIds to a specific stage of a draw with a specific entryStatus. Will fail if participantIds are not already present in event.entries. Use addEventEntries to add to both event and drawDefinition at the same time.
engine.addDrawEntries({
suppressDuplicateEntries, // do not throw error on duplicates; instead notify to DATA_ISSUE subscribers
ignoreStageSpace, // optional boolean to disable checking available positions
entryStageSequence, // optional - applies to qualifying
autoEntryPositions, // optional - keeps entries ordered by entryStage/entryStatus and auto-increments
entryStatus: ALTERNATE, // optional
entryStage: MAIN, // optional
participantIds,
eventId,
drawId,
});
addEventEntries
Adds participantIds to event.entries; optionally pass drawId to add participantIds to flightProfile.flight[].drawEntries at the same time. See examples in Tournament Entry Filters, Adding Entries, Complete Example.
Supports optional validation of participant eligibility against event category constraints (age ranges, rating requirements).
Will not throw an error if unable to add entries into specified flightProfile.flight[].drawEntries,
which can occur if a drawDefinition has already been generated and an attempt is made to add
a participant with entryStatus: DIRECT_ACCEPTANCE.
engine.addEventEntries({
suppressDuplicateEntries, // do not throw error on duplicates; instead notify to DATA_ISSUE subscribers
entryStatus: ALTERNATE, // optional; defaults to DIRECT_ACCEPTANCE
entryStage: MAIN, // optional; defaults to MAIN
autoEntryPositions, // optional - keeps entries ordered by entryStage/entryStatus and auto-increments
enforceCategory, // optional - validate against event category (age/rating); defaults to false
enforceGender, // optional - validate gender; defaults to true
participantIds,
eventId,
drawId, // optional - will add participantIds to specified flightProfile.flight[].drawEntries and drawDefinition.entries (if possible)
});
Category Validation
When enforceCategory: true, validates participants against event category constraints:
Age Validation:
- Participant must be valid throughout entire event period (start to end date)
- Requires
person.birthDateif age restrictions exist - Combined age categories (e.g.,
C50-70) are automatically skipped for individuals
Rating Validation:
- Participant must have rating matching
category.ratingType - Rating value must fall within
ratingMin/ratingMaxrange - Uses most recent rating from participant's scale items
Rejection Response:
const result = engine.addEventEntries({
participantIds: ['player1', 'player2', 'player3'],
enforceCategory: true,
eventId,
});
if (result.error) {
// result.context.categoryRejections contains detailed rejection information
result.context.categoryRejections.forEach((rejection) => {
console.log(`${rejection.participantName}:`);
rejection.rejectionReasons.forEach((reason) => {
console.log(` - ${reason.reason}`);
console.log(` Details:`, reason.details);
});
});
}
See: Entries - Category Validation for comprehensive documentation and examples.
addEventEntryPairs
Add PAIR participant to an event. Creates new { participantType: PAIR } participants if the combination of individualParticipantIds does not already exist.
engine.addEventEntryPairs({
allowDuplicateParticipantIdPairs, // optional - boolean - allow multiple pair participants with the same individualParticipantIds
uuids, // optional - array of UUIDs to use for newly created pairs
entryStatus: ALTERNATE, // optional
entryStage: QUALIFYING, // optional
participantIdPairs,
eventId,
});
checkValidEntries
const { error, success } = engine.checkValidEntries({
consideredEntries, // optional array of entries to check
enforceGender, // optional boolean - defaults to true
eventId, // required
});
destroyPairEntries
Bulk version of destroyPairEntry. Removes multiple PAIR participants from an event and converts them back to individual entries.
const { destroyedCount, errors } = engine.destroyPairEntries({
participantIds, // array of PAIR participant IDs to destroy
removeGroupParticipant, // optional boolean - also remove PAIR from tournament participants
eventId, // required
drawId, // optional
});
console.log(`Destroyed ${destroyedCount} pair entries`);
if (errors.length) {
console.log('Errors:', errors);
}
Returns:
{
destroyedCount: number; // Number of pairs successfully destroyed
errors: any[]; // Array of errors encountered
}
What it does:
- Removes PAIR participants from event entries
- Adds individual participants back with
entryStatus: UNGROUPED - Optionally removes PAIR participants from tournament entirely
- Processes multiple pairs in one operation
Use Cases:
- Canceling doubles registrations and returning to singles pool
- Breaking up pairs due to withdrawals
- Converting doubles entries to singles entries
- Cleaning up incorrect pair formations
destroyPairEntry
Removes a { participantType: PAIR } entry from an event and adds the individualParticipantIds to entries as entryStatus: UNGROUPED
engine.destroyPairEntry({
participantId, // PAIR participant ID to destroy
removeGroupParticipant, // optional boolean - also remove PAIR from tournament participants
eventId, // required
drawId, // optional
});
What it does:
- Removes PAIR participant from event.entries
- Adds both individual participants to event.entries with
entryStatus: UNGROUPED - If
drawIdprovided, also updates draw entries - Optionally removes PAIR from
tournamentRecord.participants
Use Cases:
- Player partnership dissolution
- Changing doubles teams
- Converting pair entry to individual entries for different event
Notes:
- Individual participants must exist in tournament
- PAIR participant must be in event entries
- Use
removeGroupParticipant: trueto clean up PAIR from entire tournament - See
destroyPairEntriesfor bulk operation
getEntriesAndSeedsCount
Calculates the number of seeds allowed for a draw based on entries count and seeding policy.
const { entries, stageEntries, seedsCount } = engine.getEntriesAndSeedsCount({
policyDefinitions, // optional - seeding policy
drawDefinition, // optional - draw context
drawSize, // optional - override calculated draw size
stage, // required - MAIN or QUALIFYING
event, // required - event context
drawId, // optional
});
console.log(`${stageEntries.length} entries, ${seedsCount} seeds allowed`);
Returns:
{
entries: Entry[]; // All event entries
stageEntries: Entry[]; // Entries for specified stage
seedsCount: number; // Number of seeds allowed by policy
error?: ErrorType;
}
Purpose: Determines how many seeds are allowed based on the number of entries and seeding policy configuration.
Seeding Policy Logic:
- Checks policy definition for seedsCountThresholds
- Matches entries count to threshold ranges
- Returns maximum seeds allowed for that range
- Falls back to standard seeding rules if no policy
Use Cases:
- Calculating seeds before draw generation
- Validating seeding requests against policy
- UI display of available seed positions
- Enforcing tournament seeding rules
Notes:
- Uses elimination draw size calculation (next power of 2)
- Respects seeding policy limits
- Returns stage-specific entries (MAIN vs QUALIFYING)
- Used internally by
generateDrawDefinition
getMaxEntryPosition
Returns the highest entryPosition value from entries, optionally filtered by stage and/or entryStatus.
const maxPosition = engine.getMaxEntryPosition({
entries, // array of entry objects
entryStatus, // optional filter - e.g., DIRECT_ACCEPTANCE, ALTERNATE
stage, // optional filter - e.g., MAIN, QUALIFYING
});
// Use for assigning next entry position
const nextPosition = maxPosition + 1;
Returns: number - Highest entryPosition found, or 0 if no matches
Use Cases:
- Determining next entry position when adding entries
- Finding last position in acceptance list
- Ordering entries by position
- Managing entry position sequences
Notes:
- Returns 0 if no entries match filters
- Ignores entries without
entryPosition(NaN values) - Can filter by both
stageandentryStatussimultaneously - Used internally when
autoEntryPositions: true
modifyEntriesStatus
Modify the entryStatus of participants already in an event or flight/draw. Does not allow participants assigned positions in structures to have an entryStatus of WITHDRAWN.
const result = engine.modifyEntriesStatus({
autoEntryPositions, // optional - keeps entries ordered by entryStage/entryStatus and auto-increments
participantIds, // ids of participants whose entryStatus will be modified
entryStatus, // new entryStatus
entryStage, // optional - e.g. QUALIFYING
eventSync, // optional - if there is only a single drawDefinition in event, keep event.entries in sync
extension, // optional - { name, value } - add if value; removes if value is undefined
eventId, // id of event where the modification(s) will occur
drawId, // optional - scope to a specific flight/draw
stage, // optional - scope to a specific stage
});
modifyEventEntries
Modify the entries for an event. For DOUBLES events automatically create PAIR participants if not already present. See examples: Update Entry Status.
engine.modifyEventEntries({
entryStatus = DIRECT_ACCEPTANCE,
unpairedParticipantIds = [],
participantIdPairs = [],
entryStage = MAIN,
eventId,
})
promoteAlternate
Promotes a single alternate participant to direct acceptance status.
const result = engine.promoteAlternate({
participantId, // required - participant to promote
stage, // optional - defaults to MAIN
stageSequence, // optional - for qualifying stages
eventId, // required
drawId, // optional - also promote in draw
});
Returns:
{
success: boolean;
entryStatusModified?: boolean;
error?: ErrorType;
}
Purpose: Changes participant entryStatus from ALTERNATE to DIRECT_ACCEPTANCE.
promoteAlternates
Bulk version of promoteAlternate. Promotes multiple alternates to direct acceptance.
const result = engine.promoteAlternates({
participantIds, // required - array of participant IDs to promote
stage, // optional - defaults to MAIN
stageSequence, // optional - for qualifying stages
eventId, // required
drawId, // optional - also promote in draw
});
Purpose: Efficiently promote multiple alternates at once after withdrawals.
removeDrawEntries
Removes participant entries from a drawDefinition (but not from the event).
const result = engine.removeDrawEntries({
participantIds, // required - array of participant IDs to remove
stage, // optional - target specific stage (MAIN, QUALIFYING)
stageSequence, // optional - target specific stage sequence
eventId, // required
drawId, // required
});
Purpose: Removes entries from draw only, maintaining event entries.
removeEventEntries
Removes participant entries from an event and optionally from associated draws.
const result = engine.removeEventEntries({
participantIds, // required - array of participant IDs to remove
stage, // optional - target specific stage
stageSequence, // optional - target specific stage sequence
autoRemoveUnassigned, // optional boolean - remove if not positioned in draw
removeFromDrawEntries, // optional boolean - also remove from draw entries
eventId, // required
drawId, // optional - specific draw to target
});
Purpose: Removes entries from event and optionally from draws.
setEntryPosition
Set entry position a single event entry
engine.setEntryPosition({
entryPosition,
participantId,
eventId, // optional if drawId is provided
drawId, // optional if eventId is provided
});
setEntryPositions
Set entry position for multiple event entries.
engine.setEntryPositions({
entryPositions, // array of [{ entryPosition: 1, participantId: 'participantid' }]
eventId, // optional if drawId is provided
drawId, // optional if eventId is provided
});