private void cbStarted_CheckedChanged(object sender, System.EventArgs e)
        {
            bool TeamComplete(IList <MatchParticipation> parts) => parts.Count == 11 && parts.Any(x => x.Position == PlayerPosition.Goalkeeper);

            if (!TeamComplete(playerListTeamA.Participation) || !TeamComplete(playerListTeamB.Participation))
            {
                (sender as CheckBox).Checked = false;
                MessageBox.Show("need 11 in both, need goalkeepr");
                return;
            }

            if (MessageBox.Show("Start?", "Start", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                this._match.Started = this.cbStarted.Checked;

                var data  = new EUFAEntities();
                var match = data.Matches.Find(this._match.Id);
                match.Started = true;
                data.TrySave();

                _match.Started = true;
                this.SetResultLabel();
            }

            this.cbStarted.Checked = false;
        }
        public AddEditGameEvent(int matchId, int?id)
        {
            this.id      = id;
            this.matchId = matchId;
            InitializeComponent();

            var data  = new EUFAEntities();
            var match = data.Matches
                        .Include(x => x.TournamentParticipation.Team)
                        .Include(x => x.TournamentParticipation1.Team)
                        .AsNoTracking().FirstOrDefault(x => x.Id == matchId);

            cbEvents.Items.AddRange(MatchEventCode.All.Select(x => new KeyWithView(x, MatchEventCode.GetDesc(x))).ToArray());

            rbTeamA.Text = match.TournamentParticipation.Team.CountryCode;
            rbTeamB.Text = match.TournamentParticipation1.Team.CountryCode;

            if (this.id != null)
            {
                var matchEvent = data.MatchEvents.AsNoTracking().FirstOrDefault(x => x.Id == id);

                numMinute.Value = matchEvent.MatchMinute;
                tbAdditionalInformation.Text = matchEvent.AdditionalInformation;
                cbEvents.SelectedItem        = cbEvents.Items.Cast <KeyWithView>().FirstOrDefault(x => (string)x.Key == matchEvent.EventType);
                rbTeamA.Checked = matchEvent.TeamA;
                rbTeamB.Checked = !matchEvent.TeamA;
            }

            ValidForm();
        }
        private void cbFinished_CheckedChanged(object sender, System.EventArgs e)
        {
            if (!this._match.Started)
            {
                return;
            }

            if (MessageBox.Show("Finish?", "Finish", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                var data = new EUFAEntities();

                var evs = data.MatchEvents.Where(x => x.MatchId == this._match.Id).AsNoTracking().ToList();
                var r   = MatchResultCalc.FromEvents(this._match, evs);
                if (r.TeamACount == r.TeamBCount && this._match.StageCode != Stage.Group)
                {
                    MessageBox.Show("goals, bad, sad, add penalty shootout");
                    return;
                }

                this._match.Finished = this.cbFinished.Checked;

                var match = data.Matches.Find(this._match.Id);
                match.Finished = true;
                data.TrySave();

                _match.Finished = true;

                this.SetResultLabel();
            }
        }
        private bool DidAlloc()
        {
            var didAlloc = new EUFAEntities().TournamentParticipations.Where(x => x.TournamentId == tournamentId)
                           .All(x => x.GroupLetter != null && x.GroupNumber != null);

            return(didAlloc);
        }
        public static bool StageInitialized(int tournamentId, string stage)
        {
            var items = new EUFAEntities().Matches.Include(x => x.TournamentParticipation)
                        .Where(x => x.TournamentParticipation.TournamentId == tournamentId)
                        .Where(x => x.StageCode == stage)
                        .Count();

            return(items == GamesInStage(stage));
        }
Пример #6
0
 public static void TrySave(this EUFAEntities a)
 {
     try
     {
         a.SaveChanges();
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Пример #7
0
 private void DeleteTeam_Click(object sender, System.EventArgs e)
 {
     WithSelected(x =>
     {
         var data = new EUFAEntities();
         var res  = data.Teams.Find(x.Id);
         data.Teams.Remove(res);
         data.TrySave();
         LoadTeams();
         DisplayTeams();
     });
 }
Пример #8
0
        private void Delete_Click(object sender, System.EventArgs e)
        {
            ExecuteWithSelected(t =>
            {
                if (MessageBox.Show("Delete?", "Delete", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    var data = new EUFAEntities();
                    var item = data.Tournaments.Find(t.Id);
                    data.Tournaments.Remove(item);
                    data.TrySave();

                    this.LoadTournaments();
                }
            });
        }
        private void btDelete_Click(object sender, System.EventArgs e)
        {
            if (this.listEvents.SelectedItems.Count == 1 && this.listEvents.SelectedItems[0].Tag is MatchEvent ev)
            {
                if (MessageBox.Show("Delete?", "Del", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    var dta    = new EUFAEntities();
                    var loaded = dta.MatchEvents.Find(ev.Id);
                    dta.MatchEvents.Remove(loaded);
                    dta.TrySave();

                    LoadEvents();
                }
            }
        }
Пример #10
0
        private void LoadGames()
        {
            var matches = new EUFAEntities().Matches.Where(x => x.StageCode == _stageCode)
                          .Include(x => x.TournamentParticipation.Team)
                          .Include(x => x.TournamentParticipation1.Team)
                          .Where(x => x.TournamentParticipation.TournamentId == _tournamentId)
                          .Where(x => x.TournamentParticipation1.TournamentId == _tournamentId)
                          .Include(x => x.MatchEvents)
                          .AsNoTracking()
                          .ToList();

            _allMatches   = matches;
            _shownMatches = matches;
            FilterGroups();
            ShowMatches();
        }
        public void LoadPlayerLists()
        {
            var parts = new EUFAEntities().MatchParticipations
                        .AsNoTracking()
                        .Include(x => x.Player.Team)
                        .Where(x => x.MatchId == _match.Id)
                        .AsNoTracking()
                        .ToList();

            playerListTeamA.Team = _match.TournamentParticipation.Team;
            playerListTeamB.Team = _match.TournamentParticipation1.Team;

            playerListTeamA.Participation = parts.Where(x => x.Player.Team.Id == _match.TournamentParticipation.TeamId).ToList();
            playerListTeamB.Participation = parts.Where(x => x.Player.Team.Id == _match.TournamentParticipation1.TeamId).ToList();

            playerListTeamA.MatchId = _match.Id;
            playerListTeamB.MatchId = _match.Id;
        }
        public void LoadEvents()
        {
            this.listEvents.Items.Clear();
            var items = new EUFAEntities().MatchEvents
                        .Include(x => x.Match.TournamentParticipation.Team)
                        .Include(x => x.Match.TournamentParticipation1.Team)
                        .OrderBy(x => x.MatchMinute)
                        .AsNoTracking()
                        .Where(x => x.MatchId == _match.Id).ToList();

            foreach (var item in items)
            {
                var lvi = new ListViewItem(item.MatchMinute.ToString() + "'");
                lvi.SubItems.Add(item.TeamA ? item.Match.TournamentParticipation.Team.CountryName : item.Match.TournamentParticipation1.Team.CountryName);
                lvi.SubItems.Add(MatchEventCode.GetDesc(item.EventType));
                lvi.SubItems.Add(item.AdditionalInformation);

                lvi.Tag = item;

                this.listEvents.Items.Add(lvi);
            }
        }
        private void LoadGrid()
        {
            var items = new EUFAEntities().Matches
                        .Include(x => x.MatchEvents)
                        .Include(x => x.TournamentParticipation.Team)
                        .Include(x => x.TournamentParticipation1.Team)
                        .Where(x => x.TournamentParticipation.TournamentId == selected.Id)
                        .AsNoTracking()
                        .ToList();

            matchListGroupA.Matches    = items.Where(x => x.StageCode == Stage.Group && x.TournamentParticipation.GroupLetter == "A").ToList();
            matchListGroupB.Matches    = items.Where(x => x.StageCode == Stage.Group && x.TournamentParticipation.GroupLetter == "B").ToList();
            matchListGroupC.Matches    = items.Where(x => x.StageCode == Stage.Group && x.TournamentParticipation.GroupLetter == "C").ToList();
            matchListGroupD.Matches    = items.Where(x => x.StageCode == Stage.Group && x.TournamentParticipation.GroupLetter == "D").ToList();
            matchListGroupE.Matches    = items.Where(x => x.StageCode == Stage.Group && x.TournamentParticipation.GroupLetter == "E").ToList();
            matchListGroupF.Matches    = items.Where(x => x.StageCode == Stage.Group && x.TournamentParticipation.GroupLetter == "F").ToList();
            groupOf16MatchList.Matches = items.Where(x => x.StageCode == Stage.RoundOf16).ToList();
            quarterFinalList.Matches   = items.Where(x => x.StageCode == Stage.QuarterFinal).ToList();
            finalList.Matches          = items.Where(x => x.StageCode == Stage.Final).ToList();
            semiFinalList1.Matches     = items.Where(x => x.StageCode == Stage.SemiFinal).Take(1).ToList();
            semiFinalList2.Matches     = items.Where(x => x.StageCode == Stage.SemiFinal).Skip(1).ToList();
        }
        private void btSave_Click(object sender, System.EventArgs e)
        {
            var        data = new EUFAEntities();
            MatchEvent me;

            if (this.id == null)
            {
                me = new MatchEvent();
                data.MatchEvents.Add(me);
            }
            else
            {
                me = data.MatchEvents.Find(this.id);
            }

            me.AdditionalInformation = this.tbAdditionalInformation.Text;
            me.EventType             = ((KeyWithView)this.cbEvents.SelectedItem).Key as string;
            me.MatchId     = this.matchId;
            me.MatchMinute = (int)this.numMinute.Value;
            me.TeamA       = this.rbTeamA.Checked;

            data.TrySave();
        }
        private void btSave_Click(object sender, EventArgs e)
        {
            var res = this.Groups.SelectMany(x => x.Teams).ToList();

            if (res.Count != 24)
            {
                MessageBox.Show("want 24");
                DialogResult = DialogResult.None;
                return;
            }

            var data = new EUFAEntities();
            var all  = data.TournamentParticipations.Where(x => x.TournamentId == this._tId).ToList();

            res.ForEach(x =>
            {
                var parti = all.First(p => p.TeamId == x.Id);

                parti.GroupLetter = x.GroupName.Substring(0, 1);
                parti.GroupNumber = int.Parse(x.GroupName.Substring(1, 1));
            });

            data.TrySave();
        }
        private void generateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var data = new EUFAEntities();

            data.Matches.RemoveRange(data.Matches.ToList());
            data.TournamentParticipations.RemoveRange(data.TournamentParticipations.ToList());
            data.Teams.RemoveRange(data.Teams.ToList());
            data.Players.RemoveRange(data.Players.ToList());
            data.Tournaments.RemoveRange(data.Tournaments.ToList());
            data.MatchParticipations.RemoveRange(data.MatchParticipations.ToList());
            data.MatchEvents.RemoveRange(data.MatchEvents.ToList());

            data.SaveChanges();

            var random = new Random();

            var regions = data.Regions.ToList();

            var teamIndex = 0;

            string RandomString() => string.Join(string.Empty, Enumerable.Range(0, 10).Select(x => 'A' + random.Next(0, 26)).ToList());

            Team GetTeam() => new Team
            {
                CountryCode = (teamIndex++).ToString("000"),
                CountryName = RandomString(),
                Players     = Enumerable.Range(0, 24).Select(x => new Player
                {
                    DateOfBirth = new DateTime(random.Next(1960, 1980), 1, 1),
                    FirstName   = RandomString(),
                    LastName    = RandomString(),
                    Position    = PlayerPosition.All[random.Next(0, 4)],
                    ShirtNumber = x
                }).ToList(),
                RegionId = regions[random.Next(0, regions.Count - 1)].Id
            };

            for (var i = 0; i < random.Next(1, 7); i++)
            {
                var groupCount = new Dictionary <string, int>();
                data.Tournaments.Add(new Tournament
                {
                    StartDate = new DateTime(random.Next(2000, 2015), 01, 01, 0, 0, 0, 0),
                    EndDate   = new DateTime(random.Next(2016, 2020), 01, 01, 0, 0, 0, 0),
                    Name      = RandomString(),
                    TournamentParticipations = Enumerable.Range(0, 24).Select((x, p) =>
                    {
                        var group = char.ConvertFromUtf32('A' + (p % 6));
                        if (!groupCount.ContainsKey(group))
                        {
                            groupCount.Add(group, 0);
                        }

                        return(new TournamentParticipation
                        {
                            Team = GetTeam(),
                            GroupLetter = group,
                            GroupNumber = ++groupCount[group]
                        });
                    }).ToList()
                });
            }


            data.SaveChanges();
            var tournament = data.Tournaments.First();

            foreach (var stage in Stage.All)
            {
                Stage.Init(tournament.Id, stage);

                var matches = data.Matches.Where(x => x.TournamentParticipation.TournamentId == tournament.Id && x.StageCode == stage);


                foreach (var match in matches)
                {
                    void add(List <Player> p)
                    {
                        match.MatchParticipations.Add(new MatchParticipation
                        {
                            Position = PlayerPosition.Goalkeeper,
                            PlayerId = p[0].Id,
                            MatchId  = match.Id
                        });
                        for (var i = 0; i < 10; i++)
                        {
                            match.MatchParticipations.Add(new MatchParticipation
                            {
                                PlayerId = p[i + 1].Id,
                                Position = p[i + 1].Position,
                                MatchId  = match.Id
                            });
                        }

                        match.MatchEvents.Add(new MatchEvent
                        {
                            EventType             = MatchEventCode.Goal,
                            MatchId               = match.Id,
                            MatchMinute           = 1,
                            TeamA                 = true,
                            AdditionalInformation = "bla"
                        });
                    }

                    match.Started  = true;
                    match.Finished = true;
                    var playersA = match.TournamentParticipation.Team.Players.ToList();
                    var playersB = match.TournamentParticipation1.Team.Players.ToList();

                    add(playersA);
                    add(playersB);
                }

                data.SaveChanges();
            }
        }
        public static void Init(int tournamentId, string stage)
        {
            var data    = new EUFAEntities();
            var matches = new List <Match>();
            var random  = new Random();

            void add(int a, int b, string tag = null) => matches.Add(new Match
            {
                TeamA     = a,
                TeamB     = b,
                StageCode = stage,
                Tag       = tag
            });

            Func <string, int> getWinnerFn(string tagStart)
            {
                var m = data.Matches
                        .Include(x => x.MatchEvents)
                        .Where(x => x.Tag.Length == 3).ToList()
                        .Where(x => x.Tag.StartsWith(tagStart))
                        .ToList();

                int WinnerOf(string s)
                {
                    var cur = m.First(x => x.Tag == s);

                    return(MatchResultCalc.Winner(cur, cur.MatchEvents));
                }

                return(WinnerOf);
            }

            switch (stage)
            {
            case Stage.Group:
                var parts   = data.TournamentParticipations.Where(x => x.TournamentId == tournamentId).ToList();
                var byGroup = parts.GroupBy(x => x.GroupLetter);
                foreach (var group in byGroup)
                {
                    add(group.First(x => x.GroupNumber == 1).Id, group.First(x => x.GroupNumber == 2).Id);
                    add(group.First(x => x.GroupNumber == 1).Id, group.First(x => x.GroupNumber == 3).Id);
                    add(group.First(x => x.GroupNumber == 3).Id, group.First(x => x.GroupNumber == 4).Id);
                    add(group.First(x => x.GroupNumber == 4).Id, group.First(x => x.GroupNumber == 1).Id);
                    add(group.First(x => x.GroupNumber == 2).Id, group.First(x => x.GroupNumber == 4).Id);
                    add(group.First(x => x.GroupNumber == 2).Id, group.First(x => x.GroupNumber == 3).Id);
                }

                break;

            case Stage.RoundOf16:
                var groupMatches = data.Matches.Where(x => x.TournamentParticipation.TournamentId == tournamentId)
                                   .Where(x => x.StageCode == Stage.Group)
                                   .Include(x => x.MatchEvents)
                                   .Include(x => x.TournamentParticipation)
                                   .Include(x => x.TournamentParticipation1)
                                   .ToList()
                                   .Select(x => new
                {
                    TeamAId    = x.TeamA,
                    TeamBId    = x.TeamB,
                    Group      = x.TournamentParticipation.GroupLetter,
                    TeamAScore = MatchResultCalc.FromEvents(x, x.MatchEvents).TeamACount,
                    TeamBScore = MatchResultCalc.FromEvents(x, x.MatchEvents).TeamBCount
                }).ToList();
                var dict        = new Dictionary <string, IList <int> >();
                var thirdRanked = new List <Ranking>();
                foreach (var group in groupMatches.GroupBy(x => x.Group))
                {
                    int MatchesWon(int teamId)
                    {
                        var aWon = group.Where(x => x.TeamAId == teamId && x.TeamAScore > x.TeamBScore);
                        var bWon = group.Where(x => x.TeamBId == teamId && x.TeamBScore > x.TeamAScore);

                        return(aWon.Concat(bWon).Distinct().Count());
                    }

                    int GoalsScored(int teamId)
                    {
                        var aScored = group.Where(x => x.TeamAId == teamId).Sum(x => x.TeamAScore);
                        var bScored = group.Where(x => x.TeamBId == teamId).Sum(x => x.TeamBScore);

                        return(aScored + bScored);
                    }

                    int GoalsDifference(int teamId)
                    {
                        var aScored = group.Where(x => x.TeamAId == teamId).Sum(x => x.TeamAScore - x.TeamBScore);
                        var bScored = group.Where(x => x.TeamBId == teamId).Sum(x => x.TeamBScore - x.TeamAScore);

                        return(aScored + bScored);
                    }

                    var teamsInGroup = group.Select(x => x.TeamAId).Concat(group.Select(x => x.TeamBId)).Distinct().ToList();

                    var rankedTeams = teamsInGroup
                                      .Select(x => new Ranking
                    {
                        TeamId          = x,
                        MatchesWon      = MatchesWon(x),
                        GoalsDifference = GoalsDifference(x),
                        GoalsScored     = GoalsScored(x),
                        Random          = random.Next(),
                        Group           = group.Key
                    })
                                      .OrderByDescending(x => x.MatchesWon)
                                      .ThenByDescending(x => x.GoalsDifference)
                                      .ThenByDescending(x => x.GoalsScored)
                                      .ThenBy(x => x.Random)
                                      .ToList();

                    thirdRanked.Add(rankedTeams[2]);

                    dict.Add(group.Key, rankedTeams.Select(x => x.TeamId).ToList());
                }

                var third = new Dictionary <string, string[]>
                {
                    { "ABCD", new[] { "C", "D", "A", "B" } },
                    { "ABCE", new[] { "C", "A", "B", "E" } },
                    { "ABCF", new[] { "C", "A", "B", "F" } },
                    { "ABDE", new[] { "D", "A", "B", "E" } },
                    { "ABDF", new[] { "D", "A", "B", "F" } },
                    { "ABEF", new[] { "E", "A", "B", "F" } },
                    { "ACDE", new[] { "C", "D", "A", "E" } },
                    { "ACDF", new[] { "C", "D", "A", "F" } },
                    { "ACEF", new[] { "C", "A", "F", "E" } },
                    { "ADEF", new[] { "D", "A", "F", "E" } },
                    { "BCDE", new[] { "C", "D", "B", "E" } },
                    { "BCDF", new[] { "C", "D", "B", "F" } },
                    { "BCEF", new[] { "E", "C", "B", "F" } },
                    { "BDEF", new[] { "E", "D", "B", "F" } },
                    { "CDEF", new[] { "C", "D", "F", "E" } }
                };

                var thirdRankedInOrder = thirdRanked
                                         .OrderByDescending(x => x.MatchesWon)
                                         .ThenByDescending(x => x.GoalsDifference)
                                         .ThenByDescending(x => x.GoalsScored)
                                         .Take(4)
                                         .ToList();
                var key = string.Join(string.Empty, thirdRankedInOrder.Select(x => x.Group).ToList());

                string DetermineThirdGroup(int index)
                {
                    return(third[key][index]);
                }

                add(dict["A"][1], dict["C"][1], "AF1");
                add(dict["B"][0], dict[DetermineThirdGroup(1)][2], "AF2");
                add(dict["D"][0], dict[DetermineThirdGroup(3)][2], "AF3");
                add(dict["A"][0], dict[DetermineThirdGroup(0)][2], "AF4");
                add(dict["C"][0], dict[DetermineThirdGroup(2)][2], "AF5");
                add(dict["F"][0], dict["E"][1], "AF6");
                add(dict["E"][0], dict["D"][1], "AF7");
                add(dict["B"][1], dict["F"][1], "AF8");
                break;

            case Stage.QuarterFinal:
                var qfWin = getWinnerFn("AF");
                add(qfWin("AF1"), qfWin("AF3"), "QF1");
                add(qfWin("AF2"), qfWin("AF6"), "QF2");
                add(qfWin("AF5"), qfWin("AF7"), "QF3");
                add(qfWin("AF4"), qfWin("AF8"), "QF4");
                break;

            case Stage.SemiFinal:
                var smWin = getWinnerFn("QF");
                add(smWin("QF1"), smWin("QF2"), "SF1");
                add(smWin("QF2"), smWin("QF4"), "SF2");
                break;

            case Stage.Final:
                var fWin = getWinnerFn("SF");
                add(fWin("SF1"), fWin("SF2"), "TF1");
                break;

            default:
                throw new Exception();
            }

            data.Matches.AddRange(matches);
            data.TrySave();
        }