Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 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

  • Some sanctions are based on if the penalty was incurred pre/post game, or if an injury was sustained

    • Injury attribute added to penalties; pre/post meta is out of scope initially

  • Team Officials

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

    e.g., An official

    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?

...

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

Any sanction within the same sanction group counts as an offence. Ex. the second sanction you get within the group results in Offence #2.sanctions that happen twice in a season will result in a second

Blue properties to be added with automation.

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

SanctionRuleOption

...

SanctionMember

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

Property

Type

Description

id

uuid

sanctionId

id

optionId

id

...

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

injuryMinutesDaysinjuryDays

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

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

id

uuid

seasonId

enum

games

number

Optional - Number of games the accumulation requires

days

number

Number of days

officeId

id

...

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

...

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

...

id

...

uuid

...

  • Handle indefinite and expiry dates

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-646

  • Replace code with sanctions

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-665

Accumulation
Status
colourBlue
titleTODO

  • 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

  • If there are multiple suspensions, suspensions will stack and be pending until the prior suspension has completed

  • Suspension length will be defined as a sum of totalGames, endGames and injuryGames

    • 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

    • If there is an expiry ratio defined, calculate the expiry based on the number of days

    • If the expiry falls within a break, extend it by the number of days within that break

  • When creating the suspension, send a notification to the player, team officials and office admins (except player, will be based on notification setting)

Supplemental
Status
colourGreen
titleCOMPLETE

  • League administrators may add additional suspensions to increase the required number of games and expiry date. This does not affect the automatic game suspension.

  • If a suspension has the Appealed status, it is not effective. The automatic game suspension is not affected.

  • The suspension should follow the expiry ratio logic and breaks defined in the rulebook

    Status
    colourBlue
    titleTODO

Lineup Status
Status
colourGreen
titlecomplete

  • Get all Active suspensions for each player

    Status
    colourGreen
    titleCOMPLETE

    • In soccer, exclude suspensions for other offices

      Status
      colourGreen
      titleCOMPLETE

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

    Status
    colourGreen
    titleCOMPLETE

Assigning
Status
colourGreen
titleCOMPLETE

If an official has any active suspension, they should be flagged as Suspended

Status
colourGreen
titleCOMPLETE

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

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

disciplineStatus

enum

status (SuspensionDiscipline)

...

Implementation

Screenshot 2024-09-03 at 9.56.35 AM.pngImage Added

New Scopes

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
Status
colourBlue
titletodo

  • Handle indefinite and expiry dates

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-646

  • Replace code with sanctions

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-655985

...

Accumulation
Status
colourBlue
titleTODO

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

Status
colourGreen
titleCOMPLETE

Jira Legacy
serverSystem Jira
serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
keySPR-

...

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

Status
colourGreen
titleCOMPLETE

  • This will require a task to run at midnight daily (based on the timezone of the office)

    Status
    colourGreen
    titleCOMPLETE

  • Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-646

...

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

Status
colourGreen
titleCOMPLETE

...

If there is a pending suspension dependent on a completed suspension, start the dependent suspension

Status
colourBlue
titleTODO

...

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)

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1285

  • Add ability to deactivate suspensions

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1336

Discipline Committee
Status
colourBlue
titleTODO

...

Jira Legacy
serverSystem Jira
serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
keySPR-

...

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.

  • SuspensionDiscipline Model

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1279

    • Migration to add table

    • Add new model to API (one-to-one relation with Suspension)

    • Add scopes: suspensions:view, suspensions:manage, discipline:view,discipline:manage,discipline:trigger

      • All roles that have scoresheets:view should now also have suspensions:view

      • All roles that have scoresheets:manage should now also have suspensions:manage

      • Change the current suspension model to have suspensions:view / suspensions:manage instead of scoresheets:view / scoresheets:manage

      • New SuspensionDiscipline table should have discipline:view , discipline:manage and discipline:trigger scopes.

  • EffectiveSuspension (View)

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1348

  • Adjust purging logic to account for SuspensionDiscipline

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1345

    • Where ever we show the total number of games in the UI (ex. when purging, use effectiveRequiredGames and effectiveDurationType)

    • In backend, use effectiveRequiredGames and effectiveDurationType for purging logic

  • Metabase reports → use EffectiveSuspension → effectiveRequiredGames

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1349

  • Card to display and edit discipline committee information

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1346

    • Add new card for Discipline Suspension (should only be viewable by suspensions:discipline scope roles

    • Add the following fields on the suspension grid:

      • Original required games (can be indefinite)

      • Discipline additional games (can be indefinite)

      • Effective required games (can be indefinite)

  • Required Discipline Committee option on Sanction Offense

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1344

    • Add requireDisciplineCommittee on sanction offense

    • On create of a suspension off a sanction, if requireDisciplineCommittee is true, create a suspension discipline record with a pending status.

  • Notifications for requireDisciplineCommittee suspensions

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1350

    • Will be part of the suspension email we currently send

  • View for suspensions:{} scope roles to see list of Pending SuspensionDiscipline records. Potentially a Suspension Tab / List.

    Jira Legacy
    serverSystem Jira
    serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
    keySPR-1351

    • Have ability to filter on Pending suspension discipline for suspensions:discipline scope

  • If suspension discipline goes from Pending to Active and Suspension is Completed. Move suspension from Completed back to Active. (to revise, edge case)

Lineup Status
Status
colourGreen
titlecomplete

  • Get all Active suspensions for each player

    Status
    colourGreen
    titleCOMPLETE

    • In soccer, exclude suspensions for other offices

      Status
      colourGreen
      titleCOMPLETE

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

    Status
    colourGreen
    titleCOMPLETE

Assigning
Status
colourGreen
titleCOMPLETE

  • If an official has any active suspension, they should be flagged as Suspended

    Status
    colourGreen
    titleCOMPLETE

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-655

Completion
Status
colourGreen
titleCOMPLETE

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

    Status
    colourGreen
    titleCOMPLETE

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-646

  • 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

    Status
    colourGreen
    titleCOMPLETE

    • This will require a task to run at midnight daily (based on the timezone of the office)

      Status
      colourGreen
      titleCOMPLETE

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-646

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

    Status
    colourGreen
    titleCOMPLETE

Syncing
Status
colourBlue
titleTODO

  • Will need a two-way sync with ID

    • Jira Legacy
      serverSystem Jira
      serverId03e16d48-9e59-3010-89f5-a1a3500d66b7
      keySPR-664

  • This will remove the need to query suspensions in member validation

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