public IActionResult ChangeCompanyNumberPost(long id, AdminOrganisationCompanyNumberViewModel viewModel)
        {
            Organisation organisation = dataRepository.Get <Organisation>(id);

            switch (viewModel.CurrentPage)
            {
            case AdminOrganisationCompanyNumberViewModelCurrentPage.OfferChangeOrRemove:
                return(OfferChangeOrRemove(organisation, viewModel));

            case AdminOrganisationCompanyNumberViewModelCurrentPage.Remove:
                return(Remove(organisation, viewModel));

            case AdminOrganisationCompanyNumberViewModelCurrentPage.Change:
                return(Change(organisation, viewModel));

            case AdminOrganisationCompanyNumberViewModelCurrentPage.BackToChange:
                return(BackToChange(organisation, viewModel));

            case AdminOrganisationCompanyNumberViewModelCurrentPage.ConfirmNew:
                return(ConfirmNew(organisation, viewModel));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        private IActionResult Remove(Organisation organisation, AdminOrganisationCompanyNumberViewModel viewModel)
        {
            viewModel.ParseAndValidateParameters(Request, m => m.Reason);

            if (viewModel.HasAnyErrors())
            {
                viewModel.Organisation = organisation;
                return(View("RemoveOrganisationCompanyNumber", viewModel));
            }

            auditLogger.AuditChangeToOrganisation(
                AuditedAction.AdminChangeOrganisationCompanyNumber,
                organisation,
                new
            {
                OldCompanyNumber = organisation.CompanyNumber,
                NewCompanyNumber = "(removed)",
                Reason           = viewModel.Reason
            },
                User
                );

            organisation.CompanyNumber = null;

            dataRepository.SaveChanges();

            return(RedirectToAction("ViewOrganisation", "AdminViewOrganisation", new { id = organisation.OrganisationId }));
        }
        private IActionResult Change(Organisation organisation, AdminOrganisationCompanyNumberViewModel viewModel)
        {
            viewModel.ParseAndValidateParameters(Request, m => m.NewCompanyNumber);
            viewModel.Organisation = organisation;

            if (viewModel.HasAnyErrors())
            {
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }

            string formattedCompanyNumber = viewModel.NewCompanyNumber.Trim().ToUpper();

            if (formattedCompanyNumber == organisation.CompanyNumber?.Trim().ToUpper())
            {
                viewModel.AddErrorFor(m => m.NewCompanyNumber,
                                      "Company number must be different to the current company number");
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }

            // Check that another stored organisation doesn't have the same company number
            Organisation organisationWithSameNewCompanyNumber =
                dataRepository.GetAll <Organisation>()
                .FirstOrDefault(o => o.CompanyNumber == formattedCompanyNumber);

            if (organisationWithSameNewCompanyNumber != null)
            {
                viewModel.AddErrorFor(
                    m => m.NewCompanyNumber,
                    $"Another organisation ({organisationWithSameNewCompanyNumber.OrganisationName}) has this company number");
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }

            CompaniesHouseCompany companiesHouseCompany;

            try
            {
                companiesHouseCompany = companiesHouseApi.GetCompany(formattedCompanyNumber);
            }
            catch (Exception)
            {
                viewModel.AddErrorFor(
                    m => m.NewCompanyNumber,
                    "Companies House API gave an error (maybe the API is down, or maybe the company number is invalid)");
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }

            if (companiesHouseCompany == null)
            {
                viewModel.AddErrorFor(
                    m => m.NewCompanyNumber,
                    "Companies House didn't recognise this company number");
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }

            viewModel.CompaniesHouseCompany = companiesHouseCompany;
            viewModel.NewCompanyNumber      = companiesHouseCompany.CompanyNumber; // Set the company number in the right format
            return(View("ConfirmNewOrganisationCompanyNumber", viewModel));
        }
        public IActionResult ChangeCompanyNumberGet(long id)
        {
            Organisation organisation = dataRepository.Get <Organisation>(id);

            var viewModel = new AdminOrganisationCompanyNumberViewModel
            {
                Organisation = organisation
            };

            if (string.IsNullOrEmpty(organisation.CompanyNumber))
            {
                // CompanyNumber is empty - send them straight to ChangeCompanyNumber
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }
            // CompanyNumber is not empty - ask the user if they want to change or remove the CompanyNumber
            return(View("OfferChangeOrRemoveOrganisationCompanyNumber", viewModel));
        }
        private IActionResult OfferChangeOrRemove(Organisation organisation, AdminOrganisationCompanyNumberViewModel viewModel)
        {
            viewModel.Organisation = organisation;

            viewModel.ParseAndValidateParameters(Request, m => m.ChangeOrRemove);

            if (viewModel.HasAnyErrors())
            {
                return(View("OfferChangeOrRemoveOrganisationCompanyNumber", viewModel));
            }

            // If removing CompanyNumber
            if (viewModel.ChangeOrRemove == AdminOrganisationCompanyNumberChangeOrRemove.Remove)
            {
                return(View("RemoveOrganisationCompanyNumber", viewModel));
            }

            // If changing CompanyNumber
            return(View("ChangeOrganisationCompanyNumber", viewModel));
        }
        private IActionResult ConfirmNew(Organisation organisation, AdminOrganisationCompanyNumberViewModel viewModel)
        {
            viewModel.Organisation = organisation;

            viewModel.ParseAndValidateParameters(Request, m => m.Reason);

            if (viewModel.HasAnyErrors())
            {
                return(View("ChangeOrganisationCompanyNumber", viewModel));
            }

            if (!organisation.OptedOutFromCompaniesHouseUpdate)
            {
                organisation.OptedOutFromCompaniesHouseUpdate = false;
            }

            // Audit the changes
            auditLogger.AuditChangeToOrganisation(
                AuditedAction.AdminChangeOrganisationCompanyNumber,
                organisation,
                new
            {
                OldCompanyNumber = organisation.CompanyNumber,
                viewModel.NewCompanyNumber,
                viewModel.Reason
            },
                User
                );

            organisation.CompanyNumber = viewModel.NewCompanyNumber;

            dataRepository.SaveChanges();

            // Update the organisation from Companies House (AFTER we update the company number)
            updateFromCompaniesHouseService.UpdateOrganisationDetails(organisation.OrganisationId);

            return(RedirectToAction("ViewOrganisation", "AdminViewOrganisation", new { id = organisation.OrganisationId }));
        }
 private IActionResult BackToChange(Organisation organisation, AdminOrganisationCompanyNumberViewModel viewModel)
 {
     viewModel.Organisation = organisation;
     return(View("ChangeOrganisationCompanyNumber", viewModel));
 }