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); }
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); }
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; }