• WIP
  • SPR-614 Sanctions

    https://spordle.atlassian.net/browse/SPR-614

     

    Requirements

    All sports

    • Automatic suspensions are not appealable in any sport

    • If suspended, only eligible to “purge” for the same team, otherwise suspended and cannot purge or play on other teams

    • Suspensions follow into the following season and can by served by any team in the following season

    • Schedule office (e.g., league) is responsible for administering suspensions, not team

    • Suspensions prohibit officials from officiating games (exceptions may be granted by the assigner)

    • Notifications to be sent to the player, team staff, schedule and team offices

    Baseball

    • Each branch (BQ) has it’s own rules

      • Suspensions do not apply across branches (BQ suspension does not apply in BA), but a Baseball Canada suspension (e.g., from nationals) can apply to all branches

    • Suspensions

      • All penalties (ejections) result in a 1 game suspension, then accumulate into 3 games, 5 games then indefinite

      • Suspensions accumulate by participant (any team, office within BQ)

    • No expiry time component or indefinite rules from game infractions

    Soccer

    • Each branch (SQ) has it’s own rules

      • Suspensions do not apply across offices (suspension in office A allows play in office B)

    • Suspensions

      • Yellow card

        • 3x accumulation results in a 1 game suspension

        • Resets after accumulation

      • Indirect red card

        • Results in a 1 game suspension

        • Affects accumulation of yellow cards

      • Direct red cards

        • Results in a 1 game suspension

        • No accumulation side effects

    • No expiry time component or indefinite rules from game infractions

    • Suspensions only accumulate with the same office and team

    Hockey

    Minimum guidelines

    • Federation (HC) sets minimum guidelines and each branch (BC) can extend severity

      • Suspensions apply across the entire federation/tenant

      • Suspension rules are based on the schedule office

    • If a BC team plays in an AB tournament, AB suspension guidelines will be used, unless the player fails to purge the suspension prior to returning to BC, then BC guidelines will take effect and could possibly extend the suspension

      • e.g., AB may impose a 1 game suspension while BC imposes 2 games, so a player would be required to serve 2 games upon returning to BC

    Accumulation

    • Accumulation based on a set of infractions (accumulation groups)

      • e.g., 7.2(b) will result in a 1 game suspension, and 7.3(b) in a latter game will result in an accumulation sanction due to ‘any 2 majors’.

    • Multiple sanctions may be applied from a single game

      • e.g., in a fight, player may be assessed 7.10 Fighting Major + GM (1 game) + 7.11(a) Instigator (1 game)

      • e.g., 7.2(c) in game one results in 1 game suspension, then 7.8(c) in next game results in 3 games under 7.8(c) + 5 games under AS107 which is pending until after the 3 game has completed

    • Accumulation is per season

      • Head contact accumulation resets prior to minor championships

        • 🚩 Waiting to confirm if we’re isolating the championship office or setting a reset date for this accumulation group

    • Penalty in the last 10 minutes or OT, or an injury, can affect suspension severity

      • These factors do not create multiple suspensions, just a single suspension

    • Team Officials

      • Team officials may be suspended based on penalty accumulation in the same game

        • e.g., A staff member who’s players accumulate 3 majors in a game will be assessed a 1 game suspension, then 3 games the second game that happens, and an indefinite suspension for the third game it happens

      • Head coach is suspended by default unless they’re not present, then it would be an assistant coach or manager unless the referee reports otherwise

        • 🚩 Possibly implement this based on the signatory of the lineup?

    Purging

    • Minor / Junior

      • Minor hockey suspensions don’t typically allow purging when transitioning to Junior, but there’s an exception to allow purging if they actually intend to play to help eligibility for next season. This will be handled manually by BC

    • Suspensions have a total required games and expiry date; will be considered completed when the first criteria is reached

      • Expiry has breaks (e.g., winter, summer)

      • Game/expiry ratio is not 1:1 (1/7/15/21/25/30/n*7) and varies by branch. Not defined by HC

      • Game infractions may result in indefinite suspensions with minimum number of game purges

    • Only games that were scheduled at the time of suspension may count towards to the serving of a suspension. Therefore, any game that is added to a team’s schedule after the date of a suspension, cannot be used to purge that suspension.

      • Rule added to avoid working around with an exhibition game mid-week. Did not commit to supporting this on day 1

    • Purging can only be done in the next scheduled game that was created prior to the suspension

      • Lineups of following games cannot be entered until the scheduled end time of the preceding game to prevent a potentially suspended member being added, or a suspended member being added with an excessive purge

     

     


    Sanction Models

    Infractions are the rules, penalties are violations of infractions, sanctions define infraction accumulation and suspensions are the violation of sanctions.

    Sanction

    Accumulation properties specify when the Sanction is applicable and behaviour properties specify what the resulting Suspension will be defined as.

    Any sanctions that happen twice in a season will result in a second

    Blue properties to be added with automation.

    Property

    Type

    Description

    Property

    Type

    Description

    id

    uuid

     

    seasonId

    string

    2024-25

    name

    string

    With i18n

    i18n

    jsonb

     

    code

    string

    Usually the rule number or an accumulation code

    officeId

    id

     

    parentId

    id

    Optional - To override parent sanctions

    sectionId

    id

    Physical Fouls

    externalId

    uuid

    For syncing with Spordle ID

    Accumulation

    positionGroups

    enum[]

    Optional - Applicable to players or bench staff

    accumulationCount

    number

    Default to 1

    SanctionMember

    These are the list of rule options that are part of the accumulation group. Order is not significant; any member infraction counts towards the accumulation group.

    Property

    Type

    Description

    Property

    Type

    Description

    id

    uuid

     

    sanctionId

    id

     

    optionId

    id

     

    SanctionOffense

    Number of match or days require to serve

    Property

    Type

    Description

     

    Property

    Type

    Description

     

    id

    uuid

     

     

    sanctionId

    id

     

     

    offense

    number

    1, 2, 3…

     

    Behaviour

     

    durationType

    enum

    Definite or Indefinite

     

    games

    number

    Total games required to serve

     

    lastMinutesGames

    number

    Optional - Total games required to serve when end of game or overtime (will hardcode to last 10 minutes for now)

    (undefined → fall back to totalGames)

     

    injuryGames

    number

    Optional - Total games required to serve when penalty has an injury

    (undefined → fall back to totalGames)

     

    days

    number

    Optional - Number of days to calculate the expiry date

     

    lastMinutesDays

    number

    Optional - Number of days to calculate the expiry date in the last 10 minutes

     

    injuryDays

    number

    Optional - Number of days to calculate the expiry date when penalty has an injury

     

    Accumulation

     

    positionGroups

    enum[]

    Optional - Applicable to players or bench staff

     

    accumulationCount

     

    Default to 1

     

    priority

    number

    Priority precedence order for accumulations

     

    minCount

    number

    Minimum number of infractions (>=)

     

    maxCount

    number

    Maximum number of infractions (<=)

     

    Settings Models

    OfficeBreak (V2)

    Required to define breaks when calculating the suspension expiry date for the season. Could also be used for the scheduler.

    Property

    Type

    Description

    Property

    Type

    Description

    id

    uuid

     

    seasonId

    enum

     

    type

    enum

    Sanctions, Scheduling

    startDate

    date

     

    endDate

    date

     

    officeId

    id

     

    categoryIds

    id[]

    Optionally specify which categories it applies to

    SanctionRatio

    BC Hockey defines a ratio generally, not per game, so it might be better to do the same. When games is undefined, it will serve as the default case and serve as a n:m ratio

    Property

    Type

    Description

    Property

    Type

    Description

    id

    uuid

     

    seasonId

    enum

     

    games

    number

    Optional - Number of games the accumulation requires

    days

    number

    Number of days

    officeId

    id

     

    OfficeSettings

    Office settings that affect general suspension behaviour

    Property

    Type

    Description

    Property

    Type

    Description

    lastMinutesDuration (V2)

    number

    Number of minutes before the end of the game when endGames of a sanction kicks in.

    Hockey Canada defines this as 10 minutes; QC defines this as 5 minutes

    suspensionActivation

    enum

     

    Suspension Models

    Suspension

    Property

    Type

    Description

    Property

    Type

    Description

    id

    uuid

     

    gameId

    id

    Game the suspension originated in

    participantId

    id

    Participant that was suspended

    teamId

    id

    Team that the participant is suspended in

    penaltyId

    id

    Penalty that resulted in the suspension

    positionGroup

    enum

    Position that this participant was suspended in. Player, Staff

    sanctionId

    id

    Sanction that was determined by the rulebook sanction rules

    sanctionOffenseId

    id

    Is this necessary?

    durationType

    enum

    Definite or Indefinite. This is required to be the same as the sanction duration

    requiredGames

    number

    Number of games required to complete the suspension.

    Optional when Indefinite duration type, but may be set with it

    expiry

    date

    Optional - Date when the suspension will expire if the games requirement isn’t met

    status

    enum

    Pending, Appealed, Active, Completed, Cancelled, Expired

    externalId

    uuid

    For syncing with Spordle ID

    Legacy suspension options (deprecated)

    code

    enum

    Deprecated, replaced by sanctionId

    Suspension Discipline

    Property

    Type

    Description

    Property

    Type

    Description

    id

    uuid

     

    suspensionId

    id

    Suspension

    additionalGames

    number

    Number of additional games to the suspension

    durationType

    enum

    Definite or Indefinite. To allow infinite duration

    status

    enum

    Pending | Active | Inactive

    comments

    string

    Comment section to allow the discipline committee to note changes

    reviewedBy

    string array

    Array of members that reviewed the suspension

    reviewedAt

    timestamp

    The date / time when goes from Pending to Active or Inactive

    EffectiveSuspension (View)

    Exact same properties as the Suspension + the ones bellow. When fetching suspensions (GET /suspensions) it will return the effective suspensions. On save (POST / PATCH /suspensions), it persists to the Suspension table.

    Property

    Type

    Description

    Property

    Type

    Description

    effectiveRequiredGames

    number

    requiredGames (Suspension) + additionalGames (SuspensionDiscipline) = effectiveRequiredGames

    • If requiredGames (Suspension) is indefinite there additionalGames (SuspensionDiscipline) → requiredGames counts as 0

    • If additionalGames is indefinite → effectiveRequiredGames = null (and effectiveDurationType indefinite)

    • SuspensionDiscipline has to be status = Active, else don’t use additionalGames.

    effectiveDurationType

    enum

    durationType (SuspensionDiscipline), if none → durationType (Suspension)

    disciplineAdditionalGames

     

    additionalGames (SuspensionDiscipline)

    disciplineDurationType

    enum

    durationType (SuspensionDiscipline)

    Definite or Indefinite. To allow infinite duration


    Implementation

     

    Screenshot 2024-09-03 at 9.56.35 AM.png

     

    New Scopes

    Scope

    Access

    Implementation

    Scope

    Access

    Implementation

    suspensions:view

    Can access the suspension show page or lists

    Suspension model: allow suspensions:view instead of scoresheet:view

    Any role that currently contains scoresheet:view

    suspensions:manage

    Can edit suspensions

    Suspension model: allow suspensions:manage instead of scoresheet:manage

    Any role that currently contains scoresheet:manage

    discipline:view

    Can see the suspension discipline card on a suspension

    Suspension: allow discipline:view

    SuspensionDiscipline: discipline:view

    discipline:manage

    Can edit the suspension discipline on a suspension

    Suspension: allow discipline:manage

    SuspensionDiscipline: discipline:manage

    discipline:trigger

    Has access to create a SuspensionDiscipline on a Suspension in pending status (custom endpoint)

    Custom endpoint on SuspensionDiscipline model: discipline:trigger

    Unhardcoding todo

    Accumulation TODO

    https://spordle.atlassian.net/browse/SPR-1202

    • When the game is completed (or certified, depending on settings), get all sanctions for the schedule office

    • Find matching sanctions based on the sanction members that match the penalties

    • Find all past penalties and suspensions of all suspend-able players in the same season

      • In soccer, limit both to same office

    • Determine the sanction(s) based on the accumulation rules

      • Sanctions with higher priority cancel out lower priority sanctions

      • All sanctions are added unless there is an exclusive sanction

    • Suspension length will be defined as games or lastMinutesGames with injuryGames has additional games.

      • endGames is only applicable when the penalty is in the last 10 minutes (per office settings)

      • injuryGames is only applicable when the penalty is marked as injured

    • When creating the suspension, send a notification to the player, team officials and office admins (except player, will be based on notification setting) https://spordle.atlassian.net/browse/SPR-1285

    • Add ability to deactivate suspensions https://spordle.atlassian.net/browse/SPR-1336

    Discipline Committee TODO

    https://spordle.atlassian.net/browse/SPR-1343

    As a league administrator, I want to be able to go into a suspension and increase the required number of games. I also want to see a list of all the suspensions that required discipline committee actions.

    Lineup Status complete

    • Get all Active suspensions for each player COMPLETE

      • In soccer, exclude suspensions for other offices COMPLETE

    • If the suspension is for another team, it cannot be purged COMPLETE

    Assigning COMPLETE

    Completion COMPLETE

    • If the suspension type is Indefinite, the suspension can never automatically be completed COMPLETE

    • If there is an expiry date, the suspension is considered Expired once that date passes if it is not yet completed based on the required games COMPLETE

    • A suspension completes once the suspension has the required amount of purges that are completed games COMPLETE

    Syncing TODO

     

    Additional notes JP

    • Once the new module will be completed, this will replace the Game Incident Report and the suspension module inside HCR,. We need to plan a sync process from Play to ID before we go live with that module.

    • The notification process to fill out the form is important. The people that are part of the discipline committee need a notification to let them know they have to fill or review a form. This will replace the actual distribution list in HCR. In an office in ID multiple person can be attached to the discipline committee notification and it’s hierarchical, so we need to build the same concept in Spordle Play

    • Multiple incident in the same game needs to be added to the same report.

    • Extra incident can be added manually ( not linked to a on ice infraction)

    • The pdf report is not mandatory to be sent by email , but needs to be available inside play. Notification can be enough