Beispiel #1
0
        public void IsSenior_CalculatesCorrectly()
        {
            var olympiad = new Olympiad_Info()
            {
                AgeDate = new DateTime(2016, 8, 21), SnrAge = 60
            };
            // if SnrAge is 60, then your sixtieth birthday must be at the start of the olympiad or earlier
            var contestant = new Contestant()
            {
                DateofBirth = new DateTime(1956, 8, 21)
            };
            var isSenior = contestant.IsSeniorForOlympiad(olympiad);

            Assert.IsTrue(isSenior);
            contestant = new Contestant()
            {
                DateofBirth = new DateTime(1956, 8, 22)
            };
            isSenior = contestant.IsSeniorForOlympiad(olympiad);
            Assert.IsFalse(isSenior);
            // Null date of birth disqualifies you from being Senior
            contestant = new Contestant()
            {
                DateofBirth = null
            };
            isSenior = contestant.IsSeniorForOlympiad(olympiad);
            Assert.IsFalse(isSenior);
        }
Beispiel #2
0
        public void IsJunior_CalculatesCorrectly()
        {
            var olympiad = new Olympiad_Info()
            {
                AgeDate = new DateTime(2016, 8, 21), JnrAge = 18
            };
            // if JnrAge is 18, then your nineteenth birthday must be after the start of the olympiad
            var contestant = new Contestant()
            {
                DateofBirth = new DateTime(1997, 8, 21)
            };
            var isJunior = contestant.IsJuniorForOlympiad(olympiad);

            Assert.IsFalse(isJunior);
            contestant = new Contestant()
            {
                DateofBirth = new DateTime(1997, 8, 22)
            };
            isJunior = contestant.IsJuniorForOlympiad(olympiad);
            Assert.IsTrue(isJunior);
            // Null date of birth disqualifies you from being Junior
            contestant = new Contestant()
            {
                DateofBirth = null
            };
            isJunior = contestant.IsJuniorForOlympiad(olympiad);
            Assert.IsFalse(isJunior);
        }
        private MedalFormsVm GetItemsForLatest(DataEntities context, Olympiad_Info currentOlympiad, IEnumerable <Event> events)
        {
            var vm = new MedalFormsVm()
            {
                Events = events.Select(x => new MedalFormsVm.EventVm()
                {
                    Title          = x.Mind_Sport,
                    Code           = x.Code,
                    SequenceNumber = x.Number,
                    StartDate      = x.Event_Sess.Min(s => s.Date.Value),
                    EndDate        = x.Event_Sess.Max(s => s.Date.Value),
                    StartTime      = x.Event_Sess.Min(s => s.Session1.StartTime),
                    EndTime        = x.Event_Sess.Max(s => s.Session1.FinishTime),
                    Location       = x.Location,
                    PrizeGiving    = x.Prize_Giving,
                    Prize1         = x.C1st_Prize == null ? "" : "£" + x.C1st_Prize,
                    Prize2         = x.C2nd_Prize == null ? "" : "£" + x.C2nd_Prize,
                    Prize3         = x.C3rd_Prize == null ? "" : "£" + x.C3rd_Prize,
                    OtherPrizes    = x.Other_Prizes == null ? "" : x.Other_Prizes,
                    JuniorPrizes   = string.Join(", ", (new string[] { x.JNR_1st_Prize, x.JNR_2nd_Prize, x.JNR_3rd_Prize, x.JNR_Other_Prizes }).Where(p => p != null)),
                })
                         .OrderBy(x => x.SequenceNumber)
                         .ToList()
            };

            var juniorDate = DateTime.Now.AddYears(-currentOlympiad.JnrAge.Value - 1);

            foreach (var evt in vm.Events)
            {
                var entrants = context.Entrants.Where(x => x.OlympiadId == currentOlympiad.Id && x.Game_Code == evt.Code)
                               .Join(context.Contestants, e => e.Mind_Sport_ID, c => c.Mind_Sport_ID, (e, c) => new { e, c })
                               .ToList()
                               .Select(ec => new MedalFormsVm.EntrantVm()
                {
                    FirstName   = ec.c.Firstname,
                    LastName    = ec.c.Lastname,
                    Nationality = ec.c.Nationality,
                    Junior      = (ec.c.DateofBirth.HasValue && ec.c.DateofBirth > juniorDate) ? "JNR" : ""
                })
                               .OrderBy(x => x.LastName);

                evt.Entrants = entrants;
            }

            return(vm);
        }
        private void InsertSingleEventOrder(DataEntities context, Olympiad_Info olympiad, EntryJson order,
                                            ParsedOrder parsedOrder, Dictionary <string, Fee> eventFees)
        {
            // Don't do this case yet
            if (parsedOrder.BookingSpaces != parsedOrder.Entrants.Count())
            {
                return;
            }

            List <ParsedOrder.Entrant> EntrantsToCreate = new List <ParsedOrder.Entrant>();

            var evt = context.Events.FirstOrDefault(x => x.Code == parsedOrder.EventCode &&
                                                    x.OlympiadId == olympiad.Id);

            // Bad event code
            if (evt == null)
            {
                return;
            }

            var feeExpected = 0m;

            foreach (var parsedEntrant in parsedOrder.Entrants)
            {
                var contestants = context.Contestants.Where(ContestantSelector(parsedEntrant));
                // Don't handle the case of people you can't verify yet
                if (contestants.Count() > 1)
                {
                    return;
                }
                else if (contestants.Count() == 0)
                {
                    EntrantsToCreate.Add(parsedEntrant);
                }

                if (parsedEntrant.DoB.HasValue && parsedEntrant.DoB.Value > olympiad.FirstDateOfBirthForJunior())
                {
                    feeExpected += eventFees[evt.Entry_Fee].Concession.Value;
                }
                else
                {
                    feeExpected += eventFees[evt.Entry_Fee].Adult.Value;
                }
            }

            if (feeExpected != parsedOrder.BookingPrice)
            {
                order.Notes = string.Format("Wrong fee, expected {0} found {1}; ", feeExpected, parsedOrder.BookingPrice);
                //context.SaveChanges();
                //return;
            }

            // All OK - can change entities now.
            if (order.Notes != null)
            {
                order.Notes = "";
            }

            order.Notes += "Assigned to contestant(s) ";
            CreateEntrants(context, EntrantsToCreate);
            foreach (var parsedEntrant in parsedOrder.Entrants)
            {
                var contestants = context.Contestants.Where(ContestantSelector(parsedEntrant));

                var thisPersonsFee = 0.0m;
                if (parsedEntrant.DoB.HasValue && parsedEntrant.DoB.Value > olympiad.FirstDateOfBirthForJunior())
                {
                    thisPersonsFee = eventFees[evt.Entry_Fee].Concession.Value;
                }
                else
                {
                    thisPersonsFee = eventFees[evt.Entry_Fee].Adult.Value;
                }

                var thisContestant = contestants.First();
                // All OK
                thisContestant.Payments.Add(new Payment()
                {
                    Banked         = 1,
                    MindSportsID   = contestants.First().Mind_Sport_ID,
                    OlympiadId     = olympiad.Id,
                    Payment_Method = "MSO Website",
                    Payment1       = thisPersonsFee,
                    Year           = olympiad.StartDate.Value.Year,
                    Received       = DateTime.Now
                });

                // Put the contestant into the right event
                var entrant = Entrant.NewEntrant(evt.EIN, evt.Code, olympiad.Id, thisContestant,
                                                 thisPersonsFee);
                thisContestant.Entrants.Add(entrant);

                // Update the order to avoid re-parsing
                order.ProcessedDate = DateTime.Now;
                order.Notes        += contestants.First().Mind_Sport_ID.ToString() + " ";
            }

            context.SaveChanges();
        }
        private void InsertMaxFeeOrder(DataEntities context, Olympiad_Info olympiad, EntryJson order, ParsedOrder parsedOrder)
        {
            // Something wrong with the order
            if (parsedOrder.BookingSpaces != parsedOrder.Entrants.Count())
            {
                return;
            }
            List <ParsedOrder.Entrant> EntrantsToCreate = new List <ParsedOrder.Entrant>();

            var feeExpected = 0m;

            foreach (var parsedEntrant in parsedOrder.Entrants)
            {
                var contestants = context.Contestants.Where(ContestantSelector(parsedEntrant));
                // Don't handle the case of people you can't verify yet
                if (contestants.Count() > 1)
                {
                    return;
                }
                else if (contestants.Count() == 0)
                {
                    EntrantsToCreate.Add(parsedEntrant);
                }

                if (parsedEntrant.DoB != null && parsedEntrant.DoB > olympiad.FirstDateOfBirthForJunior())
                {
                    feeExpected += olympiad.MaxCon.Value;
                }
                else
                {
                    feeExpected += olympiad.MaxFee.Value;
                }
            }

            if (feeExpected != parsedOrder.BookingPrice)
            {
                order.Notes = string.Format("Wrong fee, expected {0} found {1}", feeExpected, parsedOrder.BookingPrice);
                context.SaveChanges();
                return;
            }

            // All OK - can change entities now.
            order.Notes = "Assigned to contestant(s) ";
            CreateEntrants(context, EntrantsToCreate);
            foreach (var parsedEntrant in parsedOrder.Entrants)
            {
                var contestants = context.Contestants.Where(ContestantSelector(parsedEntrant));

                var thisPersonsFee = 0.0m;
                if (parsedEntrant.DoB.HasValue && parsedEntrant.DoB.Value > olympiad.FirstDateOfBirthForJunior())
                {
                    thisPersonsFee = olympiad.MaxCon.Value;
                }
                else
                {
                    thisPersonsFee = olympiad.MaxFee.Value;
                }

                contestants.First().Payments.Add(new Payment()
                {
                    Banked         = 1,
                    MindSportsID   = contestants.First().Mind_Sport_ID,
                    OlympiadId     = olympiad.Id,
                    Payment_Method = "MSO Website",
                    Payment1       = thisPersonsFee,
                    Year           = olympiad.StartDate.Value.Year,
                    Received       = DateTime.Now
                });

                order.ProcessedDate = DateTime.Now;
                order.Notes        += contestants.First().Mind_Sport_ID.ToString() + " ";
            }
            context.SaveChanges();
        }
        private void AddEventToDoc(string EventCode, Olympiad_Info currentOlympiad,
                                   Event evt, IEnumerable <Entrant> entrants,
                                   IDictionary <int, int> seedings, DateTime juniorDate, FlowDocument doc,
                                   bool isFirst)
        {
            Section topSection = new Section();

            topSection.BorderBrush     = Brushes.Black;
            topSection.BorderThickness = new Thickness(1);
            if (!isFirst)
            {
                topSection.BreakPageBefore = true;
            }

            Paragraph para = new Paragraph();

            para.TextAlignment = TextAlignment.Left;
            para.FontSize      = 8;
            para.Margin        = new Thickness(4);
            para.Inlines.Add(new Run(EventCode));
            para.Inlines.Add(new Run("                                                                 "));
            para.Inlines.Add(new Run(currentOlympiad.YearOf.Value.ToString()));
            topSection.Blocks.Add(para);

            para               = new Paragraph();
            para.Margin        = new Thickness(0);
            para.TextAlignment = TextAlignment.Center;
            para.FontWeight    = FontWeights.Bold;
            para.Inlines.Add(new Run(evt.Mind_Sport));
            topSection.Blocks.Add(para);

            para = new Paragraph();
            para.TextAlignment = TextAlignment.Center;
            para.FontSize      = 8;
            para.Margin        = new Thickness(4);
            para.Inlines.Add(new Run("Entries as of " + DateTime.Now.ToString()));
            topSection.Blocks.Add(para);

            doc.Blocks.Add(topSection);
            Section middleSection = new Section();

            middleSection.BorderBrush     = Brushes.Black;
            middleSection.BorderThickness = new Thickness(1);

            Table table = new Table()
            {
                CellSpacing = 0
            };

            table.Columns.Add(new TableColumn()
            {
                Width = new GridLength(90)
            });
            table.Columns.Add(new TableColumn()
            {
                Width = new GridLength(90)
            });
            table.Columns.Add(new TableColumn()
            {
                Width = new GridLength(30)
            });
            table.RowGroups.Add(new TableRowGroup());

            foreach (var e in entrants)
            {
                // Should not happen but occasionally it does
                if (e.Name == null)
                {
                    continue;
                }

                var jnr = (e.Name.DateofBirth.HasValue && (e.Name.DateofBirth.Value > juniorDate))
                    ? "JNR" : "";
                var seed = (seedings.ContainsKey(e.Mind_Sport_ID.Value)) ? " (" + seedings[e.Mind_Sport_ID.Value] + ")" : "";

                var row = new TableRow();
                row.Cells.Add(new TableCell(new Paragraph(new Run(e.Name.Firstname))
                {
                    Margin = new Thickness(2), FontSize = 10, TextAlignment = TextAlignment.Right
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(e.Name.Lastname + seed))
                {
                    Margin = new Thickness(2), FontSize = 10
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(jnr))
                {
                    Margin = new Thickness(2), FontSize = 10
                }));
                table.RowGroups[0].Rows.Add(row);
            }

            middleSection.Blocks.Add(table);

            para               = new Paragraph();
            para.Margin        = new Thickness(4);
            para.TextAlignment = TextAlignment.Right;
            para.FontWeight    = FontWeights.Bold;
            para.Inlines.Add(new Run("No. players: " + entrants.Count()));
            middleSection.Blocks.Add(para);
            doc.Blocks.Add(middleSection);

            para               = new Paragraph();
            para.Margin        = new Thickness(0);
            para.FontSize      = 8;
            para.TextAlignment = TextAlignment.Center;
            para.Inlines.Add(new Run("Any players who turn up and are not above, please list below and return this sheet to registration within 30 mins of starting your event"));
            doc.Blocks.Add(para);
        }
Beispiel #7
0
        private void AddResults(FlowDocument doc, Event evt, bool isFirst, Olympiad_Info currentOlympiad)
        {
            /* ********** Header *********** */

            Table headerTable = new Table()
            {
                CellSpacing = 0, BorderThickness = new Thickness(1), BorderBrush = Brushes.Black
            };

            headerTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(100)
            });
            headerTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(276)
            });
            headerTable.RowGroups.Add(new TableRowGroup());

            if (!isFirst)
            {
                headerTable.BreakPageBefore = true;
            }

            var trow = new TableRow();

            trow.Cells.Add(new TableCell(new Paragraph(new Run(evt.Code))
            {
                Margin = new Thickness(4), FontSize = 24, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center
            }));
            trow.Cells.Add(new TableCell(new Paragraph(new Run(evt.Mind_Sport))
            {
                Margin = new Thickness(2), FontSize = 16, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center
            }));
            headerTable.RowGroups[0].Rows.Add(trow);

            doc.Blocks.Add(headerTable);

            /************ Main body *************/

            Table bodyTable = new Table()
            {
                CellSpacing = 0
            };

            bodyTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(40)
            });
            bodyTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(113)
            });
            bodyTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(50)
            });
            bodyTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(50)
            });
            bodyTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(85)
            });
            bodyTable.Columns.Add(new TableColumn()
            {
                Width = new GridLength(40)
            });
            bodyTable.RowGroups.Add(new TableRowGroup());

            var      lastRankOrMedal = "G";
            TableRow row;

            foreach (var entrant in evt.Entrants)
            {
                row = new TableRow();
                Thickness thickness;
                var       rankOrMedal = (entrant.Medal != null) ? entrant.Medal.Substring(0, 1) : entrant.Rank.ToString();
                if (rankOrMedal != lastRankOrMedal)
                {
                    // add a bit of spacing
                    lastRankOrMedal = rankOrMedal;
                    bodyTable.RowGroups[0].Rows.Add(new TableRow()
                    {
                    });
                    thickness = new Thickness(2, 8, 2, 2);
                }
                else
                {
                    thickness = new Thickness(2);
                }

                row.Cells.Add(new TableCell(new Paragraph(new Run(rankOrMedal))
                {
                    Margin = thickness, FontSize = 10
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(entrant.Name.FullName()))
                {
                    Margin = thickness, FontSize = 10
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(entrant.Score))
                {
                    Margin = thickness, FontSize = 10
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(entrant.Tie_break))
                {
                    Margin = thickness, FontSize = 10
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(entrant.Name.Nationality))
                {
                    Margin = thickness, FontSize = 10
                }));
                row.Cells.Add(new TableCell(new Paragraph(new Run(entrant.Name.JuniorFlagForOlympiad(currentOlympiad)))
                {
                    Margin = thickness, FontSize = 10
                }));
                bodyTable.RowGroups[0].Rows.Add(row);
            }
            doc.Blocks.Add(bodyTable);

            row = new TableRow();
            row.Cells.Add(new TableCell(new Paragraph(new Run("Players: " + evt.Entrants.Count()))
            {
                Margin = new Thickness(2), FontSize = 12, FontWeight = FontWeights.Bold
            })
            {
                ColumnSpan = 6, TextAlignment = TextAlignment.Right
            });
            bodyTable.RowGroups[0].Rows.Add(row);
        }
        public void Save()
        {
            var           context = DataEntitiesProvider.Provide();
            var           id      = OlympiadId;
            Olympiad_Info o;

            if (id == 0)
            {
                o = new Olympiad_Info()
                {
                    YearOf     = int.Parse(this.YearOf),
                    Number     = this.Number,
                    Title      = this.Title,
                    Venue      = this.Venue,
                    StartDate  = this.StartDate,
                    FinishDate = this.FinishDate,
                    MaxFee     = decimal.Parse(this.MaxFee),
                    MaxCon     = decimal.Parse(this.MaxCon),
                    AgeDate    = this.AgeDate,
                    JnrAge     = int.Parse(this.JnrAge),
                    SnrAge     = int.Parse(this.SnrAge),
                    PentaLong  = int.Parse(this.PentaLong),
                    PentaTotal = int.Parse(this.PentaTotal),
                    Events     = new List <Event>(),
                    Current    = false, // will be sorted out later
                };
                context.Olympiad_Infoes.Add(o);
                context.SaveChanges();
                // So we don't have to do a full refresh of the combo
                Olympiads.RemoveAt(0);
                Olympiads.Insert(0, new OlympiadVm()
                {
                    Text = o.FullTitle(), Id = o.Id
                });
                id = o.Id;
            }
            else
            {
                o            = context.Olympiad_Infoes.FirstOrDefault(x => x.Id == id);
                o.YearOf     = int.Parse(this.YearOf);
                o.Number     = this.Number;
                o.Title      = this.Title;
                o.Venue      = this.Venue;
                o.StartDate  = this.StartDate;
                o.FinishDate = this.FinishDate;
                o.MaxFee     = decimal.Parse(this.MaxFee);
                o.MaxCon     = decimal.Parse(this.MaxCon);
                o.AgeDate    = this.AgeDate;
                o.JnrAge     = int.Parse(this.JnrAge);
                o.SnrAge     = int.Parse(this.SnrAge);
                o.PentaLong  = int.Parse(this.PentaLong);
                o.PentaTotal = int.Parse(this.PentaTotal);
                o.Current    = false;   // will be sorted out later
            }
            context.SaveChanges();
            // Now update the events and locations. Need to do here to have the reference back to the Olympiad
            foreach (var existingEvent in o.Events.ToList())
            {
                if (!Events.Any(x => x.Id == existingEvent.EIN))
                {
                    o.Events.Remove(existingEvent);
                    context.Events.Remove(existingEvent);
                }
            }
            foreach (var existingLocation in o.Locations.ToList())
            {
                if (!Locations.Any(x => x.Id == existingLocation.Id))
                {
                    o.Locations.Remove(existingLocation);
                    context.Locations.Remove(existingLocation);
                }
            }
            foreach (var evm in Events)
            {
                if (evm.Id == 0)
                {
                    var game = context.Games.FirstOrDefault(x => evm.Code.StartsWith(x.Code));
                    if (game == null)
                    {
                        throw new ArgumentOutOfRangeException("No Game for code " + evm.Code);
                    }

                    var evt = new Event()
                    {
                        Mind_Sport    = evm.Name,
                        Code          = evm.Code,
                        Olympiad_Info = o,
                        Game          = game,
                        MAX_Number    = 70,
                        ConsistentWithBoardability = true,
                        PentamindFactor            = 1.0f
                                                     // TODO more stuff here
                    };
                    o.Events.Add(evt);
                }
                else
                {
                    var evt = context.Events.Find(evm.Id);
                    // We're not doing any update here?
                }
            }
            foreach (var loc in Locations)
            {
                if (loc.Id == 0)
                {
                    o.Locations.Add(new Location()
                    {
                        Location1 = loc.Name, Olympiad_Info = o, YEAR = o.YearOf
                    });
                }
                // Not doing updates here
            }
            context.SaveChanges();

            // Make sure Current is set properly
            var oldCurrents = context.Olympiad_Infoes.Where(x => x.Current).ToList();

            oldCurrents.ForEach(ol => ol.Current = false);
            var newCurrent = context.Olympiad_Infoes.OrderByDescending(x => x.StartDate).First();

            newCurrent.Current = true;
            context.SaveChanges();

            var eventIndexer = new EventIndexer();

            eventIndexer.IndexEvents(id);

            IsDirty    = false;
            OlympiadId = id;
        }