public async Task AddCompetitorAsync(Competition competition, PersonCompetitor competitor)
        {
            var expert = calculatorManager.Find(competition.Discipline);

            if (expert == null)
            {
                throw new InvalidDisciplineException();
            }

            using (var transaction = context.UseOrBeginTransaction(IsolationLevel.RepeatableRead))
                try
                {
                    if (competitor.StartNumber == 0 || expert.AutomaticStartNumbers)
                    {
                        var highest = await(from d in context.Competitors
                                            where d.ListId == competitor.ListId
                                            select d.StartNumber).DefaultIfEmpty(0).MaxAsync();
                        competitor.StartNumber = Math.Max(expert.AutomaticStartNumberFrom, highest + 1);
                    }

                    competitor.EntityId = competitor.Person?.Id ?? competitor.PersonId;

                    await AddCompetitorAsync(competitor);

                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
        }
        public async Task <PersonCompetitor> AddNewCompetitorAsync(Competition competition, Guid listId, PersonLicense license, CompetitorStatus status, CompetitorSource source)
        {
            await context.LoadAsync(license, l => l.Club);

            var @class = await LicensesWorkflow.GetPersonLicenseVenueClassAsync(license, competition.VenueCode, competition.Discipline, competition.Starts);

            var competitor = new PersonCompetitor
            {
                ListId            = listId,
                Person            = license.Person,
                Name              = license.Person.Name,
                ShortName         = new string(license.Person.Name.PrefixedSurname.Take(50).ToArray()),
                LicenseDiscipline = license.Discipline,
                LicenseKey        = license.Key,
                LicenseFlags      = license.Flags,
                Gender            = license.Person.Gender,
                Status            = status,
                Category          = license.Category,
                Class             = @class,
                Sponsor           = license.Sponsor,
                ClubCountryCode   = license.ClubCountryCode,
                ClubCode          = license.ClubCode,
                ClubShortName     = license.Club?.ShortName,
                ClubFullName      = license.Club?.FullName,
                From              = license.Person.Address.City,
                StartNumber       = license.Number ?? 0,
                NationalityCode   = license.Person.NationalityCode,
                VenueCode         = license.VenueCode,
                Transponder1      = license.Transponder1,
                Transponder2      = license.Transponder2,
                Source            = source
            };

            await AddCompetitorAsync(competition, competitor);

            return(competitor);
        }
Beispiel #3
0
        public async Task <ICollection <PersonCompetitor> > LoadFromStreamAsync(Guid competitionId, Guid listId, Stream stream)
        {
            using (var context = contextFactory())
            {
                var distanceCombinations = await(from dc in context.DistanceCombinations
                                                 where dc.CompetitionId == competitionId
                                                 select dc).ToDictionaryAsync(dc => dc.Number, dc => dc.Id);

                using (var transaction = context.BeginTransaction(IsolationLevel.RepeatableRead))
                    using (var reader = new StreamReader(stream, Encoding))
                        using (var csv = new CsvReader(reader, configuration))
                            try
                            {
                                var competitors = new List <PersonCompetitor>();
                                while (csv.Read())
                                {
                                    if (csv.CurrentRecord.Length < 3)
                                    {
                                        throw new FormatException(string.Format(Resources.TooFewFields, 8, csv.Row));
                                    }

                                    var key     = csv.GetField(0);
                                    var license = await context.PersonLicenses.Include(pl => pl.Club)
                                                  .Include(pl => pl.Person)
                                                  .FirstOrDefaultAsync(pl => pl.IssuerId == LongTrackLicenses.IssuerId && pl.Discipline == LongTrackLicenses.Discipline && pl.Key == key);

                                    if (license == null)
                                    {
                                        throw new PersonNotFoundException(string.Format(Resources.PersonLicenseKeyNotFound, LongTrackLicenses.IssuerId, LongTrackLicenses.Discipline,
                                                                                        key));
                                    }

                                    var combinations = csv.GetField(1).Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries).Select(g => int.Parse(g.Trim()));

                                    int startNumber;
                                    if (!int.TryParse(csv.GetField(2), NumberStyles.None, CultureInfo.InvariantCulture, out startNumber))
                                    {
                                        throw new FormatException(string.Format(Resources.InvalidStartNumber, csv.GetField(2), csv.Row));
                                    }

                                    var category  = csv.CurrentRecord.Length >= 4 ? csv.GetField(3) : license.Category;
                                    var name      = csv.CurrentRecord.Length >= 9 ? new Name(null, csv.GetField(6), csv.GetField(7), csv.GetField(8)) : license.Person.Name;
                                    var shortName = csv.CurrentRecord.Length >= 5 ? csv.GetField(4) : name.ToInitialNameString();

                                    var competitor = new PersonCompetitor
                                    {
                                        Id                = Guid.NewGuid(),
                                        EntityId          = license.PersonId,
                                        ListId            = listId,
                                        PersonId          = license.PersonId,
                                        Name              = name,
                                        ShortName         = shortName,
                                        LicenseDiscipline = LongTrackLicenses.Discipline,
                                        LicenseKey        = license.Key,
                                        LicenseFlags      = license.Flags,
                                        Gender            = license.Person.Gender,
                                        Status            = CompetitorStatus.Confirmed,
                                        Category          = category,
                                        ClubCountryCode   = license.Club?.CountryCode,
                                        ClubCode          = license.Club?.Code,
                                        ClubShortName     = license.Club?.ShortName,
                                        ClubFullName      = license.Club?.FullName,
                                        From              = license.Person.Address.City,
                                        StartNumber       = startNumber,
                                        NationalityCode   = license.Person.NationalityCode,
                                        VenueCode         = license.VenueCode,
                                        Source            = CompetitorSource.Manual,
                                        Added             = DateTime.UtcNow
                                    };
                                    context.Competitors.Add(competitor);

                                    foreach (var combination in combinations.Where(combination => distanceCombinations.ContainsKey(combination)))
                                    {
                                        context.DistanceCombinationCompetitors.Add(new DistanceCombinationCompetitor
                                        {
                                            Competitor            = competitor,
                                            DistanceCombinationId = distanceCombinations[combination],
                                            Status = DistanceCombinationCompetitorStatus.Confirmed
                                        });
                                    }

                                    competitors.Add(competitor);
                                    await context.SaveChangesAsync();
                                }

                                transaction.Commit();
                                return(competitors);
                            }
                            catch
                            {
                                transaction.Rollback();
                                throw;
                            }
            }
        }
Beispiel #4
0
        public async Task <IList <RecordTime> > GetRecordsBrokeAsync(IDisciplineCalculator calculator, Distance distance, PersonCompetitor competitor, TimeSpan time)
        {
            if (distance.Competition == null)
            {
                throw new ArgumentNullException(nameof(distance), Resources.DistanceCompetitionIsNull);
            }
            if (competitor.Person == null)
            {
                throw new ArgumentNullException(nameof(competitor), Resources.PersonCompetitorPersonIsNull);
            }

            var season = calculator.Season(distance.Competition.Starts);
            var age    = calculator.SeasonAge(season, competitor.Person.BirthDate);

            return(await(from rt in context.RecordTimes
                         where rt.LicenseIssuerId == distance.Competition.LicenseIssuerId &&
                         rt.Discipline == distance.Competition.Discipline &&
                         rt.DistanceDiscipline == distance.Discipline &&
                         rt.Distance == distance.Value &&
                         rt.Gender == competitor.Person.Gender &&
                         ((rt.Type == RecordType.National || rt.Type == RecordType.World) ||
                          (rt.Type == RecordType.Track && rt.VenueCode == distance.VenueCode) ||
                          (rt.Type == RecordType.TrackAge && rt.VenueCode == distance.VenueCode && rt.FromAge <= age && rt.ToAge >= age)) &&
                         time < rt.Time
                         select rt).ToListAsync());
        }