Specifikation för Konstlotterihanteringsapplikationen
=====================================================
Beskrivning
-----------
Applikationen kommer att användas för att administrera konstlotteriet som genomförs varje år.
Lotteriet går till enligt följande:
* Varje år genomförs en ny lottdragning.
* Deltagare anmäler sig till lotteriet och betalar en avgift.
* Avgifterna används för att köpa in ett antal konstverk.
* Varje konstverk hör till potten för en specifik lottdragning.
* Alla betalande deltagare deltar i lottdragningen varje år.
* En deltagare har rätt till en ordinarie lott vid varje lottdragning.
* Deltagare kan även erhålla rätt till en extra lott efter avslutad lottdragning enligt beskrivning nedan.
* En deltagare kan inte inneha rätter till fler än 3 lotter (1 ordinarie lott samt 2 extralotter).
* Varje lott utgörs av namnet på respektive deltagare.
* Lottdragningen följer metaforen att lottbiljetter skapas i form av lappar med deltagarnas namn och läggs
i en hatt och sedan dras lapparna ur hatten, en och en.
* Vid årets slut genomförs lottdragningen enligt följande:
* Dragningen startas.
* Lottbiljetter skapas för varje deltagare
* En ordinarie lottbiljett för varje deltagare
* Extra lottbiljett(-er) för de deltagare som har rätt till sådana
* Varje lotteribiljett pekar ut en deltagare
* Alla lottbiljetter läggs i hatten
* En vinstlista skapas
* Varje rad i vinstlistan anger en deltagare, samt ett valt konstverk
* Listan är sorterad med 1:a vinsten i toppen
* Vinstlistan är initialt tom
* Följande repeteras till dess att dragningens pott med konstverk är tom:
* Dra en lott ur hatten
* Lotten tas då bort ur hatten
* Om lotten pekar ut en deltagare som redan har vunnit ignoreras den och man drar en ny lott
* Den deltagare som lotten pekar ut får välja ett valfritt konstverk ur potten
* Deltagaren och konstverket läggs till i vinstlistan
* Konstverket tas bort från potten för lottdragningen
* Dragningen stängs.
* De deltagare som inte vann något tilldelas rätt till en extra lott vid nästa års dragning.
* För de deltagare som vann ett konstverk, är eventuella extra lotter förverkas och de kommer alltså inte ha några extra lotträtter till nästa år.
## Stretch
Applikationen skall stödja att varje deltagare själv kan skapa en rangordningslista över alla konstverk i potten.
Denna lista används under dragningen om en deltagare som inte är närvarande får en lott dragen. I detta fall väljs det högst rankade, vilken ännu inte utdelats som vinst, från deltagarens rangordningslista.
En deltagare har en rangordningslista per lottdragning.
Användningsfall
---------------
Applikation skall stödja följande användningsfall:
- Det finns ett excelark med användare och hur många lotter de har per 2023. Man skall kunna importera dessa till applikationen.
- Registrera en ny deltagare med namn och email
- Ta bort en existerande deltagare
- Skapa ny lottdragning
- Registrera konstverk till lottdragningspotten
- eventuellt med bild
- Visa alla lottdragningar
- Visa en specifik lottdragning
- visa konstverken
- Genomföra lottdragning
- Starta lottdragning
- initiera en "hatt" med lotter
- Dra en lott
- slumpa fram ett deltagarnamn ur "hatten" och ta bort lotten från "hatten"
- Registrera vinst (deltagare och valt konstverk)
- Avsluta lottdragning
- Tilldela extra lotter till deltagare som inte vann något. Dock kan man max få 2 extralotter.
- Lottdragningen markeras som stängd.
## Stretch
- Deltagare kan logga in med begränsad behörighet att endast kunna administrera sin rangordningslista
- Skapa rangordningslista för lottdragning
- Redigera rangordningslista (framförallt frontendfunktion för att visa rangordningslistan med bilder och information om konstverken och lunna ändra ordning i listan)
- Spara uppdaterad rangordningslista
- Under lottdragning:
- Autovälja vinst (för en deltagare som inte närvarar) och välja ur deltagarens rangordningslista
Domain model
------------
```plantuml
class Konstlotteriet {
}
class Deltagare {
förnamn:String
efternamn:String
antalExtralotter:Integer
}
class Lott {
}
class Konstverk {
titel:String
konstnär:String
}
class Lottdragning {
genomförandedatum:DatumMedTid
start: DatumMedTid
slut: DatumMedTid
}
class Vinst {
}
class Rangordningslista {
}
Konstlotteriet *--> "0..n" Deltagare
Konstlotteriet *--> "0..1" Lottdragning
Lott ---> "1" Deltagare:hör-till >
Lottdragning *-down--> "0..n\nhatt" Lott
Lottdragning "1" *---> "0..n\npott" Konstverk
Lottdragning *----> "0..1\nvinstlista" Vinst: {sorterad}
Vinst --> "1" Deltagare
Vinst --> "1" Konstverk
Deltagare --> "0..n" Rangordningslista
Rangordningslista --> "1" Lottdragning
Rangordningslista --down-> "0..n\nrangordningslista" Konstverk: {sorterad}
```