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} ```