Skip to main content

Sanctioning Governor

import { sanctioningGovernor } from 'tods-competition-factory';

The sanctioningGovernor re-exports all sanctioning mutation and query functions for use outside the sanctioning engine. While the sanctioningEngine provides a complete stateful API, the governor exports individual functions that can be called directly with a sanctioningRecord parameter.

For full engine documentation including state management, executionQueue, and workflow examples, see Sanctioning Engine.


Mutations

createSanctioningRecord

Creates a new SanctioningRecord in DRAFT status.

{
governingBodyId: string;
applicant: Applicant;
proposal: TournamentProposal;
sanctioningLevel?: string;
sanctioningPolicy?: string;
}

Returns: { success, sanctioningRecord }


updateProposal

Updates proposal fields on a record in editable status (DRAFT or MODIFICATION_REQUESTED).

{ sanctioningRecord: SanctioningRecord; updates: Partial<TournamentProposal> }

addEventProposal / removeEventProposal / updateEventProposal

CRUD operations for event proposals within a sanctioning record.

// Add
{ sanctioningRecord; eventProposal: EventProposal }
// Returns: { success, eventProposalId }

// Remove
{ sanctioningRecord; eventProposalId: string }

// Update
{ sanctioningRecord; eventProposalId: string; updates: Partial<EventProposal> }

submitApplication

Transitions DRAFTSUBMITTED. Validates endorsement if required by policy. Snapshots the policy version.

{ sanctioningRecord; sanctioningPolicy?: SanctioningPolicy; submittedBy?: string }

reviewApplication

Transitions SUBMITTEDUNDER_REVIEW.

{ sanctioningRecord; reviewer?: Reviewer }

approveApplication

Transitions UNDER_REVIEW or CONDITIONALLY_APPROVEDAPPROVED.

{ sanctioningRecord; approvedBy?: string; reason?: string }

conditionallyApprove

Transitions UNDER_REVIEWCONDITIONALLY_APPROVED with conditions.

{ sanctioningRecord; conditions: Array<{ description: string }>; approvedBy?: string }

meetCondition

Marks a condition as met. Returns { allConditionsMet: boolean }.

{ sanctioningRecord; conditionId: string; metNotes?: string }

rejectApplication

Transitions to REJECTED (terminal).

{ sanctioningRecord; rejectedBy?: string; reason?: string }

withdrawApplication

Transitions to WITHDRAWN (terminal). Available from DRAFT, SUBMITTED, CONDITIONALLY_APPROVED, APPROVED, MODIFICATION_REQUESTED.

{ sanctioningRecord; withdrawnBy?: string; reason?: string }

requestModification

Transitions to MODIFICATION_REQUESTED, making the proposal editable again.

{ sanctioningRecord; requestedBy?: string; note?: string }

requestEndorsement / endorseApplication / declineEndorsement

Endorsement sub-workflow.

// Request
{ sanctioningRecord; endorserId: string; endorserName?: string; endorserContact?: PersonReference }

// Endorse
{ sanctioningRecord; endorserNotes?: string; conditions?: string[] }

// Decline
{ sanctioningRecord; declineReason?: string }

addReviewNote

Adds a review note to the record.

{ sanctioningRecord; note: string; reviewerId?: string; reviewerName?: string }

Returns: { success, noteId }


activateFromSanctioning

Generates a tournamentRecord from an APPROVED sanctioning record and transitions to ACTIVE.

{ sanctioningRecord; sanctioningPolicy?: SanctioningPolicy }

Returns: { success, tournamentRecord }


proposeAmendment

Proposes changes to an APPROVED or ACTIVE record. Minor amendments are auto-approved; substantial amendments require review.

{ sanctioningRecord; changes: ProposalChange[]; sanctioningPolicy?: SanctioningPolicy; proposedBy?: string }

Returns: { success, amendmentId, severity, autoApproved }


reviewAmendment

Approves or rejects a proposed amendment. Approved amendments apply their changes to the proposal.

{ sanctioningRecord; amendmentId: string; approved: boolean; reviewerNotes?: string }

transitionToPostEvent

Transitions ACTIVEPOST_EVENT.

{ sanctioningRecord; transitionedBy?: string }

submitComplianceItem / verifyComplianceItem / waiveComplianceItem

Compliance item lifecycle management.

// Submit
{ sanctioningRecord; itemId: string; value?: any }

// Verify
{ sanctioningRecord; itemId: string }
// Returns: { success, allCompliant: boolean }

// Waive
{ sanctioningRecord; itemId: string; reason?: string }

flagComplianceIssues

Transitions POST_EVENTISSUES_FLAGGED.

{ sanctioningRecord; transitionedBy?: string; reason?: string }

closeApplication

Transitions to CLOSED (terminal).

{ sanctioningRecord; closedBy?: string; reason?: string }

Queries

querySanctioningRecord

Returns a deep copy of the sanctioning record.

{ sanctioningRecord }

getAvailableTransitions

Returns valid status transitions for the record's current status.

{ sanctioningRecord }

Returns: { success, availableTransitions: SanctioningStatus[] }


getStatusHistory

Returns the full status transition history.

{ sanctioningRecord }

Returns: { success, statusHistory: StatusTransition[] }


getCompleteness

Returns a completeness score (0-100%) with missing fields.

{ sanctioningRecord; sanctioningPolicy?: SanctioningPolicy }

Returns: { success, completeness: { score, totalFields, completedFields, missingFields } }


getEligibleTiers

Returns which policy tiers the proposal qualifies for.

{ proposal: TournamentProposal; sanctioningPolicy: SanctioningPolicy }

Returns: { success, eligibleTiers, tierEligibilities }


getCalendarConflicts

Detects scheduling conflicts using injected calendar context.

{ sanctioningRecord; calendarContext: CalendarContext }

Returns: { success, conflicts, errors, warnings, hasConflicts }

Conflict types: PROXIMITY, SAME_WEEK, BLACKOUT, MAX_EVENTS_PER_WEEK


validateProposal

Validates proposal against policy and optional tier constraints.

{ proposal: TournamentProposal; sanctioningPolicy: SanctioningPolicy; sanctioningTier?: string }

Returns: { success, valid, issues, errors, warnings }

Checks: insurance, safety plan, medical plan, anti-corruption, safeguarding, lead time, prize money, courts, event types, draw types, draw sizes, match formats, genders, qualifying, personnel.


validateStatusTransition

Validates whether a status transition is allowed.

{ fromStatus: SanctioningStatus; toStatus: SanctioningStatus }

Returns: { success, valid } or { error } with valid targets in context.