public async Task <ICollection <TransponderBagSet> > ResetBagAsync(string licenseIssuerId, string discipline, string name, IEnumerable <int> sets)
        {
            var now = DateTime.UtcNow;

            using (var transaction = context.BeginTransaction(IsolationLevel.RepeatableRead))
                try
                {
                    var bag = await context.TransponderBags.Include(b => b.Sets).FirstOrDefaultAsync(
                        b => b.LicenseIssuerId == licenseIssuerId && b.Discipline == discipline && b.Name == name);

                    if (bag == null)
                    {
                        throw new TransponderBagNotFoundException();
                    }

                    foreach (var set in bag.Sets.ToList())
                    {
                        context.TransponderBagSets.Remove(set);
                    }
                    await context.SaveChangesAsync();

                    var bagSets = new List <TransponderBagSet>();
                    foreach (var setNumber in sets)
                    {
                        var set = await context.TransponderSets.FirstOrDefaultAsync(
                            s => s.LicenseIssuerId == licenseIssuerId && s.Discipline == discipline && s.Number == setNumber);

                        var bagSet = new TransponderBagSet
                        {
                            Bag   = bag,
                            Set   = set,
                            Added = now
                        };
                        context.TransponderBagSets.Add(bagSet);
                        bagSets.Add(bagSet);
                        await context.SaveChangesAsync();
                    }

                    transaction.Commit();
                    return(bagSets);
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
        }
        public async Task ResetVenueSubscriptionsAsync(string issuerId, string discipline, ICollection <string> keys, string venueCode, string venueDiscipline, int?season)
        {
            var calculator = calculatorManager.Find(discipline);

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

            season = season ?? calculator.CurrentSeason;
            var validFrom = calculator.SeasonStarts(season.Value);
            var validTo   = calculator.SeasonEnds(season.Value);

            using (var transaction = context.BeginTransaction(IsolationLevel.Serializable))
                try
                {
                    var venue = await context.Venues.FirstOrDefaultAsync(v => v.Code == venueCode && v.Discipline == venueDiscipline);

                    if (venue == null)
                    {
                        throw new VenueNotFoundException();
                    }

                    if (!discipline.StartsWith(venue.Discipline))
                    {
                        throw new InvalidDisciplineException();
                    }

                    var existing = await context.PersonLicenseVenueSubscriptions.Where(s => s.VenueCode == venueCode && s.VenueDiscipline == venueDiscipline).ToListAsync();

                    foreach (var subscription in existing)
                    {
                        context.PersonLicenseVenueSubscriptions.Remove(subscription);
                        await context.SaveChangesAsync();
                    }

                    foreach (var key in keys)
                    {
                        var subscription = new PersonLicenseVenueSubscription
                        {
                            LicenseIssuerId   = issuerId,
                            LicenseDiscipline = discipline,
                            LicenseKey        = key,
                            ValidFrom         = validFrom,
                            ValidTo           = validTo,
                            Issued            = DateTime.UtcNow,
                            Venue             = venue
                        };
                        context.PersonLicenseVenueSubscriptions.Add(subscription);
                        try
                        {
                            await context.SaveChangesAsync();
                        }
                        catch (Exception e)
                        {
                            throw new PersonLicenseNotFoundException(issuerId, discipline, key, e);
                        }
                    }

                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
        }