COOLbackend

Web app for 0-0-0.nl

View the Project on GitHub PJvanDiepen/COOLbackend

Database

Er is een MySQL database voor schaakverenigingen en toernooien met de volgende tabellen:

Competitie

De database heeft een tabel Team voor teams en competities. De eerste letter van teamCode in Team maakt het onderscheid tussen team en competitie. De teamCode van een interne competitie begint met de letter i. De teamCode van een externe competitie begint met een andere letter of cijfer. Bij de Waagtoren zijn dat teams, die meespelen voor de NHSB met de letter n en de KNSB met een cijfer.

Bij de Waagtoren tellen de uitslagen van teamleden in de externe competities mee voor de interne competitie. Daarom staan ze in 0-0-0. 0-0-0 berekent geen ranglijsten van externe competities. 0-0-0 berekent dus uitsluitend ranglijsten van interne competities. Zie Reglement.

Het belangrijkste verschil tussen team en competitie is dus de verwerking door 0-0-0. Behalve de eerste letter van teamCode is in de database verder geen verschil tussen team en competitie. De specificaties voor competitie staan daarom bij Team.

Reglement

De ranglijst van de Waagtoren wordt berekend volgens het Alkmaar Systeem voorlopig door middel van stored procedures / functions in MySQL. Omdat het reglement van de interne competitie per seizoen kan verschillen en omdat het nuttig is om te kunnen experimenteren met aanpassingen van het reglement willen we verschillende versies van parameters en formules voor de berekening van de ranglijst vastleggen in Reglement. De verwerking voor de ranglijst berekening is dan als volgt: selecteer de juiste versie volgens Reglement en verwerk de uitslagen per seizoen en competitie met de juiste versie van de stored procedures / functions in MySQL.

Hoe de 0-0-0 ranglijsten maakt, is dus helemaal in de database vastgelegd en niet in de JavaScript code van 0-0-0. Op deze manier gaan we, behalve het Alkmaar Systeem, ook het Keizer Systeem en Zwitsers Systeem in Reglement coderen. Elke schaakvereniging kan dus eventueel per seizoen haar eigen reglement voor de interne competitie vastleggen in Reglement. Ons doel is dat wedstrijdleiders zelf wedstrijdsystemen kunnen aanpassen en ermee kunnen experimenteren.

Voor het indelen van wie tegen wie in de interne competitie gelden ook allerlei regels, die per wedstrijdsysteem, per schaakvereniging en per seizoen kunnen verschillen. Daarom willen we ook die vastleggen in Reglement en niet in de JavaScript code van 0-0-0.

Voor het opstellen van invallers in teams voor de externe competitie gelden allerlei regels, die per schaakbond en per seizoen kunnen verschillen. Daarom willen we ook die vastleggen in Reglement en niet in de JavaScript code van de 0-0-0.

De specificaties van de Reglement tabel ontbreken nog.

Voorlopig staan de volgende stored functions voor het Alkmaar Systeem wel in de database van de Waagtoren, maar nog niet in Reglement:

De interneRating is in principe gelijk aan de knsbRatingvan 1 september aan het begin van het seizoen.

Persoon

knsbNummer INT
naam VARCHAR(45)
PRIMARY KEY (knsbNummer)

In 0-0-0 willen we zo min mogelijk persoonsgegevens vastleggen. Het knsbNummer komt uit OLA, de Online Leden Administratie van de KNSB. Voor uitslagen en ranglijsten is naam voldoende. Andere persoonsgegevens staan in OLA en worden beheerd door de secretaris en de penningmeester en niet door de wedstrijdleider.

In Persoon staan voorlopig uitsluitend leden van de eigen schaakvereniging. 0-0-0 kan daarom wel complete uitslagen lijsten produceren van de interne competitie, maar de bij uitslagen van externe competitie staat uitsluitend de naam van de eigen speler, bordnummer, kleur, resultaat en eventueel de naam van het team van de tegenstander, want die gegevens staan in Ronde.

Een knsbNummer bestaat uit 7 cijfers en die krijgt een lid van de KNSB. Leden van de schaakvereniging, die nog niet een officieel knsbNummer hebben, krijgen een tijdelijk nummer in de reeks vanaf knsbNummer = 100 tot knsbNummer = 1000000.

Gebruiker

knsbNummer INT
uuidToken CHAR(36)
email VARCHAR(100)
telefoon CHAR(15)
voorkeur CHAR(1)
clubCode INT
rol CHAR(1)
PRIMARY KEY (uuidToken)
FOREIGN KEY (knsbNummer) REFERENCES Persoon (knsbNummer)

De gebruikers van 0-0-0 staan in Gebruiker. 0-0-0 herkent een gebuiker aan het uuidToken, dat is opgeslagen op de computer van de gebruiker. Een gebruiker van 0-0-0 kan zich aanmelden met een email en/of een telefoon en krijgt dan van de systeembeheerder een uuidToken. In voorkeur staat welk contact: email, WhasApp, Signal, enz. de gebruiker wil gebruiken voor de teamleider, wedstrijdleider van een competitie en het bestuur van de schaakvereniging.

Speler

clubCode INT
seizoen CHAR(4)
teamCode CHAR(3)
knsbNummer INT
knsbRating INT
interneRating INT
rol char(1)
PRIMARY KEY (clubCode, seizoen, teamCode, knsbNummer)
FOREIGN KEY (clubCode, seizoen, teamCode) REFERENCES Team (clubCode, seizoen, teamCode)
FOREIGN KEY (knsbNummer) REFERENCES Persoon (knsbNummer)

Een deelnemer in een competitie of team staat in Speler. Een speler krijgt per seizoen uit een KNSB ratinglijst een nieuwe knsbRating, die wordt gebruikt voor de indeling in een team van de KNSB en NHSB competitie. Volgens de reglementen geldt de knsbRating van 1 september aan het begin van het seizoen. De interneRating is hetzelfde als de knsbRating tenzij er geen knsbRating is. De interneRating wordt gebruikt voor de subgroep van de interne competitie.

De verschillende rollen van spelers worden vastgelegd in rol:

De rol van wedstrijdleider, teamleider of vaste speler in een team is vastgelegd in Speler in combinatie met clubCode, seizoen en de teamCode van competitie of team. Een speler kan namelijk spelen in meerdere competities en teams. De rol van ontwikkelaar, systeembeheerder of bestuurder geldt voor een schaakvereniging en is vastgelegd in Speler in combinatie met clubCode, seizoen en teamCode = rol.

Team

clubCode INT
seizoen CHAR(4)
teamCode CHAR(3)
reglement INT
maand INT
jaar INT
omschrijving VARCHAR(45)
borden INT
PRIMARY KEY (clubCode, seizoen, teamCode)

Het seizoen van een schaakvereniging loopt meestal van eind augustus tot juni.

Voorlopig is er 1 database namelijk van de Waagtoren vanaf seizoen 2018-2019. ClubCode = 0 verwijst naar de Waagtoren. Deze seizoensgegevens zijn vastgelegd als seizoen = '1819'.

Elk seizoen krijgt een verwijzing naar de juiste versie van parameters en formules voor de berekening van de ranglijst volgens Reglement. Bij elk seizoen van een schaakvereniging hoort een aantal spelers en een aantal teams in de interne en externe competitie.

In elke seizoen heeft de schaakvereniging interne competities en teams die spelen in de externe competities van de KNSB en de regionale onderbond. 0-0-0 berekent ranglijsten voor interne competities, maar niet voor teams in de externe competities. De uitslagen van externe competities van de eigen teams de schaakvereniging staan wel in 0-0-0, omdat ze meetellen in de interne competitie.

Elk team heeft een unieke teamCode per seizoen. De Waagtoren heeft teamCode = int voor de interne competitie, teamCode = ira voor de rapid competitie, teamCode = '1' voor het eerste team in de KNSB, teamCode = 'kbe' voor het KNSB bekerteam, teamCode = n1 voor het eerste team in de NHSB enz. Elk team heeft een vast aantal borden.

Ronde

clubCode INT
seizoen CHAR(4)
teamCode CHAR(3)
rondeNummer INT
uithuis CHAR(1)
tegenstander VARCHAR(45)
datum DATE
PRIMARY KEY (clubCode, seizoen, teamCode, rondeNummer)
FOREIGN KEY (clubCode, seizoen, teamCode) REFERENCES Team (clubCode, seizoen, teamCode)

Elk team speelt een aantal ronden uit of thuis tegen een team van een tegenstander op een bepaalde datum. Indien alle datums voor de ronden bekend zijn, kan 0-0-0 voor elke speler een kalender produceren.

Uitslag

clubCode INT
seizoen CHAR(4)
teamCode CHAR(3)
rondeNummer INT
bordNummer INT
knsbNummer INT
partij CHAR(1)
witZwart CHAR(1)
tegenstanderNummer INT
resultaat CHAR(1)
datum DATE
competitie CHAR(3)
PRIMARY KEY (clubCode, seizoen, teamCode, rondeNummer, knsbNummer)
FOREIGN KEY (clubCode, seizoen, teamCode) REFERENCES Team (clubCode, seizoen, teamCode)
FOREIGN KEY (clubCode, seizoen, teamCode, rondeNummer) REFERENCES Ronde (clubCode, seizoen, teamCode, rondeNummer)
FOREIGN KEY (knsbNummer) REFERENCES Persoon (knsbNummer)
FOREIGN KEY (tegenstanderNummer) REFERENCES Persoon (knsbNummer)
FOREIGN KEY (clubCode, seizoen, competitie) REFERENCES Team (clubCode, seizoen, teamCode)

Een uitslag doorloopt 3 fases: planning, indeling en uitslag.

  1. In de planning fase heeft een speler zich voor een competitie of is aangemeld door een teamleider een speler voor een wedstrijd. Daarna kan de speler zich eventueel afmelden Meedoen kent 3 varianten: extern uit, extern thuis en (intern) meedoen.
  2. De indeling fase is als bekend wie de tegenstander wordt.
  3. De laatste fase is als het resultaat bekend is en de uitslag dus compleet is.

De verschillende fases worden vooral vastgelegd in partij:

Voor de interne competitie staat elke uitslag twee keer in Uitslag voor wit en voor zwart. Een keer is de witspeler vermeld in knsbNummer en de zwartspeler in tegenstanderNummer en een keer is de zwartspeler vermeld in knsbNummer en de witspeler in tegenstanderNummer.

Voor de externe competitie zijn er twee mogelijkheden.

  1. Indien de externe partij wordt gespeeld in plaats van een interne partij staat de uitslag twee keer in Uitslag: een keer met teamCode = int en een keer met de teamCode bij welke team deze uitslag hoort.
  2. Indien de externe partij op een andere dag wordt gespeeld staat de uitslag een keer in Uitslag met de teamCode bij welke team deze uitslag hoort.

Voor elke externe partij staat in Uitslag bij knsbNummer de speler van de eigen schaakvereniging en meestal tegenstanderNummer = 0. Het is mogelijk om tegenstanderNummer in te vullen bij een externe wedstijd tegen een team van de eigen schaakvereniging (of als alle tegenstanders in Persoon zijn vastgelegd).
Indien competitie = int telt deze uitslag mee voor de interne competitie.

De verschillende mogelijkheden voor knsbNummer en tegenstanderNummer zijn:

Mutatie

tijdstip DATETIME
knsbNummer INT,
url VARCHAR(100),
aantal INT,
invloed INT,
PRIMARY KEY (tijdstip, knsbNummer, url)
FOREIGN KEY (knsbNummer) REFERENCES Persoon (knsbNummer)

In de mutatie tabel wordt vastgelegd welke gebruiker en wanneer iets muteert in tabellen van de database. Welke gebruiker staat in knsbNummer en wanneer staat in tijdstip. In url staat de omschrijving van de mutatie in url-vorm zoals die door de frontend aan de backend is doorgegeven. In aantal staat hoeveel rijen zijn gemuteerd. In invloed legt 0-0-0 vast hoeveel invloed de mutatie heeft, zodat de frontend kan vragen of er tijdens een sessie belangijke mutaties zijn geweest.

De verschillende mogelijkheden voor invloed zijn: