public TournamentOrganizationRegistration AddRegistration(Guid tournamentId, Guid organizationId, Guid billedOrganizationId, int teamsWanted, int adjudicatorsWanted, String notes, User user)
        {
            if (tournamentId != Guid.Empty
                && organizationId != Guid.Empty
                && billedOrganizationId != Guid.Empty
                && (teamsWanted > 0 || adjudicatorsWanted > 0))
            {

                TournamentOrganizationRegistration registration = new TournamentOrganizationRegistration
                {
                    TournamentId = tournamentId,
                    OrganizationId = organizationId,
                    BilledOrganizationId = billedOrganizationId,
                    TeamsWanted = teamsWanted,
                    AdjudicatorsWanted = adjudicatorsWanted,
                    TeamsGranted = 0,
                    TeamsPaid = 0,
                    AdjudicatorsGranted = 0,
                    AdjudicatorsPaid = 0,
                    LockAutoAssign = false,
                    OrganizationStatusDraft = true,
                    Notes = notes
                };
                registration.UpdateTrackingData(user);
                SetBookingCode(registration);
                unitOfWork.GetRepository<TournamentOrganizationRegistration>().Insert(registration);
                unitOfWork.Save();
                return registration;
            }
            return null;
        }
        public ActionResult Register(TournamentOrganizationRegistration registration)
        {
            var ident = HttpContext.User.Identity as ClaimsIdentity;
            var organizationId = userManager.FindById(ident.GetUserId()).CurrentOrganizationId;
            var currentOrganizationId = (Guid)(organizationId == null ? Guid.Empty : organizationId);
            if (currentOrganizationId == Guid.Empty)
            {
                return RedirectToAction("Select", "Organization", new { returnUrl = HttpContext.Request.RawUrl });
            }

            var organization = unitOfWork.GetRepository<Organization>().GetById(registration.OrganizationId);

            var user = unitOfWork.GetRepository<User>().GetById(ident.GetUserId());
            //if (user == null) {
            //    return RedirectToAction("Login", "User");
            //}


            if (userManager.HasOrganizationRole(user.Id, currentOrganizationId, OrganizationRole.Delegate))
            {
                var tournament = unitOfWork.GetRepository<Tournament>().GetById(registration.TournamentId);

                if (tournament != null
                    && IsOpenForRegistration(tournament))
                {


                    // check if university is required

                    if (tournament.UniversityRequired
                        && !IsUniversity(organization))
                    {
                        return View("UniversityRequired");
                    }

                    // check number of teams and adjudicators
                    if (registration.TeamsWanted > tournament.TeamCap)
                    {
                        ModelState.AddModelError("", Resources.TournamentRegistration.Strings.ErrorTeamsWantedExceedTeamCap);
                    }

                    if (registration.AdjudicatorsWanted > tournament.AdjudicatorCap)
                    {
                        ModelState.AddModelError("", Resources.TournamentRegistration.Strings.ErrorAdjWantedExceedAdjCap);
                    }

                    if (tournament.AdjucatorSubtract != null
                        && registration.AdjudicatorsWanted < registration.TeamsWanted - (int)tournament.AdjucatorSubtract)
                    {

                        ModelState.AddModelError("", Resources.TournamentRegistration.Strings.ErrorAdjWantedBelowPolicy);
                    }

                    // check if organization can be billed
                    if (organization.Id != registration.BilledOrganizationId
                        && organization.LinkedOrganizations.FirstOrDefault(
                            o => o.Id == registration.BilledOrganizationId) == null)
                    {

                        ModelState.AddModelError("BilledOrganizationId", Resources.TournamentRegistration.Strings.ErrorOrganizationCannotBeBilled);
                    }


                    // Everything okay, so register
                    if (ModelState.IsValid)
                    {

                        try
                        {
                            var registrationSaved = unitOfWork.GetRepository<TournamentOrganizationRegistration>().GetById(registration.TournamentId, registration.OrganizationId);

                            // if old registration found, update it
                            if (registrationSaved != null)
                            {
                                registrationSaved.BilledOrganizationId = registration.BilledOrganizationId;
                                registrationSaved.TeamsWanted = registration.TeamsWanted;
                                registrationSaved.AdjudicatorsWanted = registration.AdjudicatorsWanted;
                                registrationSaved.Notes = registration.Notes;
                                registrationSaved.UpdateTrackingData(user);
                            }

                            // otherwise create a new one
                            else
                            {
                                registration.TeamsGranted = 0;
                                registration.TeamsPaid = 0;
                                registration.AdjudicatorsGranted = 0;
                                registration.AdjudicatorsPaid = 0;
                                registration.UpdateTrackingData(user);
                                unitOfWork.GetRepository<TournamentOrganizationRegistration>().Insert(registration);
                            }
                            unitOfWork.Save();
                            return RedirectToAction("Display", new { organizationId = registration.OrganizationId, tournamentId = registration.TournamentId });
                        }
                        catch (DataException)
                        {
                            ModelState.AddModelError("", Resources.Strings.ErrorSaveChanges);
                        }
                    }
                    else
                    {
                        registration.OrganizationId = currentOrganizationId;
                        registration.Organization = unitOfWork.GetRepository<Organization>().GetById(currentOrganizationId);
                        // On errors, display registration form again
                        return View(registration);
                    }


                }
                else
                {
                    // tournament not found or not open for registration
                    return RedirectToAction("Index");
                }
            }

            // if user is not authorized, redirect to home
            return RedirectToAction("Home", "Index");
        }