public async Task AdminController_ManualChanges_POST_Fix_Organisation_Names_Works_When_Run_In_Live_Mode_Async()
        {
            // Arrange
            var orgThatWillBeFixed = new OrganisationName {
                Name = "Org to fix ltd", Created = VirtualDateTime.Now, OrganisationId = 55
            };

            var orgThatWontBeSelectedToBeFixed = new OrganisationName {
                Name = "Org not to be fixed", Created = VirtualDateTime.Now, OrganisationId = 66
            };

            #region setting up database and controller

            User notAdminUser    = UserHelper.GetDatabaseAdmin();
            var  adminController = UiTestHelper.GetController <AdminController>(notAdminUser.UserId, null, null);

            Mock <IDataRepository> configurableDataRepository = AutoFacExtensions.ResolveAsMock <IDataRepository>();

            configurableDataRepository
            .Setup(x => x.Get <User>(It.IsAny <long>()))
            .Returns(notAdminUser);

            configurableDataRepository
            .Setup(x => x.GetAll <OrganisationName>())
            .Returns(new[] { orgThatWillBeFixed, orgThatWontBeSelectedToBeFixed }.AsQueryable().BuildMock().Object);

            var manualChangesViewModel = new ManualChangesViewModel {
                Command = FixOrganisationNamesCommand
            };

            #endregion

            /* live */
            manualChangesViewModel.LastTestedCommand = manualChangesViewModel.Command;
            manualChangesViewModel.LastTestedInput   = manualChangesViewModel.Parameters;

            // Act
            IActionResult manualChangesResult = await adminController.ManualChanges(manualChangesViewModel);

            // Assert
            Assert.NotNull(manualChangesResult, "Expected a Result");

            var manualChangesViewResult = manualChangesResult as ViewResult;
            Assert.NotNull(manualChangesViewResult, "Expected ViewResult");

            var actualManualChangesViewModel = manualChangesViewResult.Model as ManualChangesViewModel;
            Assert.NotNull(actualManualChangesViewModel, "Expected ManualChangesViewModel");

            Assert.Multiple(
                () => {
                Assert.AreEqual("SUCCESSFULLY EXECUTED 'Fix organisation names': 1 items", actualManualChangesViewModel.SuccessMessage);
                Assert.AreEqual(
                    "An email will be sent to '*****@*****.**' when the background task 'FixOrganisationsNamesAsync' has completed\r\n",
                    actualManualChangesViewModel.Results);
                Assert.IsNull(actualManualChangesViewModel.LastTestedCommand);
                Assert.IsNull(actualManualChangesViewModel.LastTestedInput);
                Assert.False(actualManualChangesViewModel.Tested, "Must be tested=false as this case is running in LIVE mode");
                Assert.IsNull(actualManualChangesViewModel.Comment);
            });
        }
 public bool IsCompanyNameEqual(OrganisationName organisationName, string companyName)
 {
     return(string.Equals(
                organisationName.Name,
                companyName,
                StringComparison.Ordinal));
 }
        private void AddOrganisationName(Organisation organisation, string name, SourceOfData sourceOfData)
        {
            organisation.OrganisationName = name;

            string source;

            switch (sourceOfData)
            {
            case SourceOfData.CompaniesHouse:
                source = "CoHo";
                break;

            case SourceOfData.Manual:
                source = "User";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(sourceOfData), sourceOfData, null);
            }

            var organisationName = new OrganisationName
            {
                Organisation = organisation,
                Name         = name,
                Source       = source
            };

            organisation.OrganisationNames.Add(organisationName);

            dataRepository.Insert(organisationName);
        }
        private void SetupContext()
        {
            _ovoNumber = new OvoNumber("OVO000015");
            _datavlaanderenOrganisationName = new OrganisationName("Departement van verloren gebouwen");
            _provenanceUri = "uri//11";

            var dataVlaanderenProviderMock = new Mock <IDataVlaanderenProvider>();

            _wegwijsProviderMock = new Mock <IWegwijsProvider>();

            dataVlaanderenProviderMock
            .Setup(provider => provider.GetOrganisationAsync(_ovoNumber))
            .ReturnsAsync(() => new Optional <Organisation>(
                              new Organisation
            {
                Name       = _datavlaanderenOrganisationName,
                OvoNumber  = _ovoNumber,
                Provenance = OrganisationProvenance.FromDataVlaanderen(_provenanceUri)
            }));

            _sut = new OrganisationProvider(
                Mock.Of <ILogger <OrganisationProvider> >(),
                dataVlaanderenProviderMock.Object,
                _wegwijsProviderMock.Object);
        }
Пример #5
0
        private void SetupContext()
        {
            _ovoNumber = new OvoNumber("OVO000015");
            _wegwijsOrganisationName = new OrganisationName("Departement van verloren straten");
            _provenanceUri           = "uri//12";

            _dataVlaanderenProviderMock = new Mock <IDataVlaanderenProvider>();
            _wegwijsProviderMock        = new Mock <IWegwijsProvider>();

            _dataVlaanderenProviderMock
            .Setup(provider => provider.GetOrganisationAsync(_ovoNumber))
            .ThrowsAsync(new Exception());

            _dataVlaanderenProviderMock
            .Setup(provider => provider.GetOrganisationFailedMessage())
            .Returns("error message");

            _wegwijsProviderMock
            .Setup(provider => provider.GetOrganisationAsync(_ovoNumber))
            .ReturnsAsync(() => new Optional <Organisation>(
                              new Organisation
            {
                Name       = _wegwijsOrganisationName,
                OvoNumber  = _ovoNumber,
                Provenance = OrganisationProvenance.FromWegwijsSearch(_provenanceUri)
            }));

            _sut = new OrganisationProvider(
                Mock.Of <ILogger <OrganisationProvider> >(),
                _dataVlaanderenProviderMock.Object,
                _wegwijsProviderMock.Object);
        }
Пример #6
0
        private void AddNewNameToOrganisation(OrganisationName organisationName, Organisation organisation)
        {
            organisationName.OrganisationId = organisation.OrganisationId;
            organisation.OrganisationNames.Add(organisationName);
            organisation.OrganisationName = organisationName.Name;

            SharedBusinessLogic.DataRepository.Insert(organisationName);
        }
        private void AddNewNameToOrganisation(OrganisationName organisationName, Organisation organisation)
        {
            organisationName.OrganisationId = organisation.OrganisationId;
            organisation.OrganisationNames.Add(organisationName);
            organisation.OrganisationName = organisationName.Name;

            dataRepository.Insert(organisationName);
        }
        private OrganisationName CreateOrganisationNameFromViewModel(ChangeOrganisationNameViewModel viewModel)
        {
            var organisationName = new OrganisationName {
                Name    = viewModel.Name,
                Created = VirtualDateTime.Now,
                Source  = "Service Desk",
            };

            return(organisationName);
        }
Пример #9
0
 private OrganisationDetailsViewModel ConvertToViewModel(OrganisationName organisation)
 {
     return(new OrganisationDetailsViewModel
     {
         Address = organisation.Address.FormatAddress(),
         Name = organisation.Name,
         Type = organisation.Type,
         DateOfInception = organisation.RegistrationDate,
         ReferenceNumber = organisation.Code,
         PublicSectorDataSource = (short?)organisation.SubType,
         Sector = organisation.Sector
     });
 }
Пример #10
0
 public CompetentAuthorityWasAssigned(
     PublicServiceId publicServiceId,
     OvoNumber competentAuthorityCode,
     OrganisationName competentAuthorityName,
     PublicServiceRegistry.PublicService.OrganisationProvenance competentAuthorityProvenance)
 {
     PublicServiceId              = publicServiceId;
     CompetentAuthorityCode       = competentAuthorityCode;
     CompetentAuthorityName       = competentAuthorityName;
     CompetentAuthorityProvenance =
         new OrganisationProvenance(
             competentAuthorityProvenance.Source,
             competentAuthorityProvenance.Uri);
 }
        public IActionResult DeleteNameGet(long organisationId, long nameId)
        {
            Organisation     organisation = dataRepository.Get <Organisation>(organisationId);
            OrganisationName name         = organisation.OrganisationNames.FirstOrDefault(oa => oa.OrganisationNameId == nameId);

            if (name == null)
            {
                throw new Exception($"Name ID {nameId} is not a valid name for this Organisation");
            }

            var viewModel = new DeleteOrganisationNameViewModel
            {
                Organisation = organisation,
                OrganisationNameToBeDeleted = name
            };

            return(View("DeleteNameCheck", viewModel));
        }
Пример #12
0
        public void UpdateName(Organisation organisation, CompaniesHouseCompany organisationFromCompaniesHouse)
        {
            string companyNameFromCompaniesHouse = organisationFromCompaniesHouse.CompanyName;

            companyNameFromCompaniesHouse = FirstHundredChars(companyNameFromCompaniesHouse);

            if (IsCompanyNameEqual(organisation.GetName(), companyNameFromCompaniesHouse))
            {
                return;
            }

            var nameToAdd = new OrganisationName {
                Organisation = organisation, Name = companyNameFromCompaniesHouse, Source = SourceOfChange, Created = VirtualDateTime.Now
            };

            organisation.OrganisationNames.Add(nameToAdd);
            organisation.OrganisationName = companyNameFromCompaniesHouse;
            dataRepository.Insert(nameToAdd);
        }
        protected override void ExecuteActivity(CodeActivityContext context)
        {
            TracingService.Trace("Hello!");
            // Extract email domain
            var orgName = OrganisationName.Get <string>(context);

            if (string.IsNullOrEmpty(orgName))
            {
                TracingService.Trace("No organisation name specified.");
                return;
            }
            // Get organisations using this domain
            var fetchXml = $@"
<fetch distinct='true' aggregate='true' returntotalrecordcount='true'>
  <entity name='account'>
    <attribute name='accountid' alias='accountid' groupby='true' />
    <attribute name='ace_mainorganisation' alias='ace_mainorganisation' groupby='true' />
    <attribute name='new_grantiumapplicantnumber' alias='new_grantiumapplicantnumber' groupby='true' />
    <filter>
      <condition attribute='name' operator='eq' value='{orgName}'/>
      <condition attribute='statecode' operator='eq' value='0'/>
    </filter>
    <link-entity name='contact' from='parentcustomerid' to='accountid' link-type='outer' alias='c'>
      <order alias='numberOfContacts' descending='true' />
      <attribute name='parentcustomerid' alias='numberOfContacts' aggregate='count' />
    </link-entity>
  </entity>
</fetch>";

            TracingService.Trace(fetchXml);
            var result = Service.RetrieveMultiple(new FetchExpression(fetchXml));

            TracingService.Trace("Got {0} organisations...", result.TotalRecordCount);
            if (result.TotalRecordCount > 0 && result.TotalRecordCount <= 10)
            {
                var org = result.Entities[0].ToEntityReference();
                Account.Set(context, org);
            }
        }
        private void SaveChangesAndAuditAction(ChangeOrganisationNameViewModel viewModel, Organisation organisation)
        {
            string oldName = organisation.OrganisationName;

            OrganisationName newOrganisationName = CreateOrganisationNameFromViewModel(viewModel);

            AddNewNameToOrganisation(newOrganisationName, organisation);

            dataRepository.SaveChanges();

            auditLogger.AuditChangeToOrganisation(
                AuditedAction.AdminChangeOrganisationName,
                organisation,
                new
            {
                Action    = viewModel.Action,
                OldName   = oldName,
                NewName   = newOrganisationName.Name,
                NewNameId = newOrganisationName.OrganisationNameId,
                Reason    = viewModel.Reason
            },
                User);
        }
        public IActionResult DeleteNamePost(long organisationId, long nameId, DeleteOrganisationNameViewModel viewModel)
        {
            Organisation     organisation = dataRepository.Get <Organisation>(organisationId);
            OrganisationName name         = organisation.OrganisationNames.FirstOrDefault(oa => oa.OrganisationNameId == nameId);

            if (name == null)
            {
                throw new Exception($"Name ID {nameId} is not a valid name for this Organisation");
            }

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

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

            auditLogger.AuditChangeToOrganisation(
                AuditedAction.AdminDeleteOrganisationPreviousName,
                organisation,
                new
            {
                DeletedName            = name.Name,
                DeletedNameId          = name.OrganisationNameId,
                DeletedNameSource      = name.Source,
                DeletedNameCreatedDate = name.Created.ToString("d MMM yyyy"),
                Reason = viewModel.Reason
            },
                User);

            dataRepository.Delete(name);
            dataRepository.SaveChanges();

            return(View("SuccessfullyDeletedOrganisationName", organisation));
        }
Пример #16
0
        public async Task DnBImportAsync(ILogger log, long currentUserId)
        {
            if (RunningJobs.Contains(nameof(CompaniesHouseCheck)) ||
                RunningJobs.Contains(nameof(DnBImportAsync)))
            {
                return;
            }

            RunningJobs.Add(nameof(DnBImportAsync));
            string userEmail    = null;
            string error        = null;
            var    startTime    = VirtualDateTime.Now;
            var    totalChanges = 0;
            var    totalInserts = 0;

            try
            {
                #region Load and Prechecks

                //Load the D&B records
                var dnbOrgsPaths =
                    await _SharedBusinessLogic.FileRepository.GetFilesAsync(_SharedBusinessLogic.SharedOptions.DataPath,
                                                                            Filenames.DnBOrganisations());

                var dnbOrgsPath = dnbOrgsPaths.OrderByDescending(f => f).FirstOrDefault();
                if (string.IsNullOrEmpty(dnbOrgsPath))
                {
                    return;
                }

                if (!await _SharedBusinessLogic.FileRepository.GetFileExistsAsync(dnbOrgsPath))
                {
                    throw new Exception("Could not find " + dnbOrgsPath);
                }

                var AllDnBOrgs = await _SharedBusinessLogic.FileRepository.ReadCSVAsync <DnBOrgsModel>(dnbOrgsPath);

                if (!AllDnBOrgs.Any())
                {
                    log.LogWarning($"No records found in '{dnbOrgsPath}'");
                    return;
                }

                AllDnBOrgs = AllDnBOrgs.OrderBy(o => o.OrganisationName).ToList();

                //Check for duplicate DUNS
                var count = AllDnBOrgs.Count() - AllDnBOrgs.Select(o => o.DUNSNumber).Distinct().Count();
                if (count > 0)
                {
                    throw new Exception($"There are {count} duplicate DUNS numbers detected");
                }

                //Check for no addresses
                count = AllDnBOrgs.Count(o => !o.IsValidAddress());
                if (count > 0)
                {
                    throw new Exception(
                              $"There are {count} organisations with no address detected (i.e., no AddressLine1, AddressLine2, PostalCode, and PoBox).");
                }

                //Check for no organisation name
                count = AllDnBOrgs.Count(o => string.IsNullOrWhiteSpace(o.OrganisationName));
                if (count > 0)
                {
                    throw new Exception($"There are {count} organisations with no OrganisationName detected.");
                }

                //Check for duplicate employer references
                var allEmployerReferenceCount = AllDnBOrgs.Count(o => !string.IsNullOrWhiteSpace(o.EmployerReference));
                var employerReferences        = new SortedSet <string>(
                    AllDnBOrgs.Where(o => !string.IsNullOrWhiteSpace(o.EmployerReference))
                    .Select(o => o.EmployerReference).Distinct());
                count = allEmployerReferenceCount - employerReferences.Count;
                if (count > 0)
                {
                    throw new Exception($"There are {count} duplicate EmployerReferences detected");
                }

                //Check companies have been updated
                count = AllDnBOrgs.Count(
                    o => !string.IsNullOrWhiteSpace(o.CompanyNumber) &&
                    o.DateOfCessation == null &&
                    (o.StatusCheckedDate == null ||
                     o.StatusCheckedDate.Value.AddMonths(1) < VirtualDateTime.Now));
                if (count > 0)
                {
                    throw new Exception(
                              $"There are {count} active companies who have not been checked with companies house within the last month");
                }

                //Fix Company Number
                Parallel.ForEach(
                    AllDnBOrgs.Where(o => !string.IsNullOrWhiteSpace(o.CompanyNumber)),
                    dnbOrg =>
                {
                    if (dnbOrg.CompanyNumber.IsNumber())
                    {
                        dnbOrg.CompanyNumber = dnbOrg.CompanyNumber.PadLeft(8, '0');
                    }
                });

                //Check for duplicate company numbers
                var companyNumbers =
                    AllDnBOrgs.Where(o => !string.IsNullOrWhiteSpace(o.CompanyNumber)).Select(o => o.CompanyNumber);
                count = companyNumbers.Count() - companyNumbers.Distinct().Count();
                if (count > 0)
                {
                    throw new Exception($"There are {count} duplicate CompanyNumbers detected");
                }

                //Get the current users email address
                var user = await _SharedBusinessLogic.DataRepository.GetAll <User>()
                           .FirstOrDefaultAsync(u => u.UserId == currentUserId);

                userEmail = user?.EmailAddress;

                //Count records requiring import
                count = AllDnBOrgs.Count(
                    o => !o.GetIsDissolved() &&
                    (o.ImportedDate == null || string.IsNullOrWhiteSpace(o.CompanyNumber) ||
                     o.ImportedDate < o.StatusCheckedDate));
                if (count == 0)
                {
                    return;
                }

                var dbOrgs = _SharedBusinessLogic.DataRepository.GetAll <Organisation>().ToList();

                #endregion

                //Set all existing org employer references
                await ReferenceEmployersAsync();

                #region Set all existing org DUNS

                var dnbOrgs = AllDnBOrgs
                              .Where(o => o.OrganisationId > 0 && string.IsNullOrWhiteSpace(o.EmployerReference))
                              .ToList();
                if (dnbOrgs.Count > 0)
                {
                    foreach (var dnbOrg in dnbOrgs)
                    {
                        var org = dbOrgs.FirstOrDefault(o => o.OrganisationId == dnbOrg.OrganisationId);
                        if (org == null)
                        {
                            if (!_SharedBusinessLogic.SharedOptions.IsProduction())
                            {
                                continue;
                            }

                            throw new Exception($"OrganisationId:{dnbOrg.OrganisationId} does not exist in database");
                        }

                        if (!string.IsNullOrWhiteSpace(org.DUNSNumber))
                        {
                            continue;
                        }

                        org.DUNSNumber        = dnbOrg.DUNSNumber;
                        dnbOrg.OrganisationId = null;
                    }

                    await _SharedBusinessLogic.DataRepository.SaveChangesAsync();

                    dbOrgs = await _SharedBusinessLogic.DataRepository.GetAll <Organisation>().ToListAsync();

                    await _SharedBusinessLogic.FileRepository.SaveCSVAsync(AllDnBOrgs, dnbOrgsPath);

                    AllDnBOrgs = await _SharedBusinessLogic.FileRepository.ReadCSVAsync <DnBOrgsModel>(dnbOrgsPath);

                    AllDnBOrgs = AllDnBOrgs.OrderBy(o => o.OrganisationName).ToList();
                }

                #endregion

                var allSicCodes = await _SharedBusinessLogic.DataRepository.GetAll <SicCode>().ToListAsync();

                dnbOrgs = AllDnBOrgs.Where(o => o.ImportedDate == null || o.ImportedDate < o.StatusCheckedDate)
                          .ToList();
                while (dnbOrgs.Count > 0)
                {
                    var allBadSicCodes = new ConcurrentBag <OrganisationSicCode>();

                    var c          = 0;
                    var dbChanges  = 0;
                    var dnbChanges = 0;

                    foreach (var dnbOrg in dnbOrgs)
                    {
                        //Only do 100 records at a time
                        if (c > 100)
                        {
                            break;
                        }

                        var dbChanged = false;
                        var dbOrg     = dbOrgs.FirstOrDefault(o => o.DUNSNumber == dnbOrg.DUNSNumber);

                        var dataSource = string.IsNullOrWhiteSpace(dnbOrg.NameSource) ? "D&B" : dnbOrg.NameSource;
                        var orgName    = new OrganisationName
                        {
                            Name = dnbOrg.OrganisationName.Left(100), Source = dataSource
                        };

                        if (dbOrg == null)
                        {
                            dbOrg = string.IsNullOrWhiteSpace(dnbOrg.CompanyNumber)
                                ? null
                                : dbOrgs.FirstOrDefault(o => o.CompanyNumber == dnbOrg.CompanyNumber);
                            if (dbOrg != null)
                            {
                                dbOrg.DUNSNumber = dnbOrg.DUNSNumber;
                            }
                            else
                            {
                                dbOrg = new Organisation
                                {
                                    DUNSNumber        = dnbOrg.DUNSNumber,
                                    EmployerReference = dnbOrg.EmployerReference,
                                    OrganisationName  = orgName.Name,
                                    CompanyNumber     = string.IsNullOrWhiteSpace(dnbOrg.CompanyNumber)
                                        ? null
                                        : dnbOrg.CompanyNumber,
                                    SectorType      = dnbOrg.SectorType,
                                    DateOfCessation = dnbOrg.DateOfCessation
                                };
                                dbOrg.OrganisationNames.Add(orgName);

                                //Create a presumed in-scope for current year
                                var newScope = new OrganisationScope
                                {
                                    Organisation    = dbOrg,
                                    ScopeStatus     = ScopeStatuses.PresumedInScope,
                                    ScopeStatusDate = VirtualDateTime.Now,
                                    Status          = ScopeRowStatuses.Active,
                                    SnapshotDate    = _snapshotDateHelper.GetSnapshotDate(dbOrg.SectorType)
                                };
                                _SharedBusinessLogic.DataRepository.Insert(newScope);
                                dbOrg.OrganisationScopes.Add(newScope);

                                //Create a presumed out-of-scope for previous year
                                var oldScope = new OrganisationScope
                                {
                                    Organisation    = dbOrg,
                                    ScopeStatus     = ScopeStatuses.PresumedOutOfScope,
                                    ScopeStatusDate = VirtualDateTime.Now,
                                    Status          = ScopeRowStatuses.Active,
                                    SnapshotDate    = newScope.SnapshotDate.AddYears(-1)
                                };
                                _SharedBusinessLogic.DataRepository.Insert(oldScope);
                                dbOrg.OrganisationScopes.Add(oldScope);

                                dbOrg.SetStatus(OrganisationStatuses.Active, currentUserId, "Imported from D&B");
                            }
                        }
                        //Skip dissolved companies
                        else if (_OrganisationBusinessLogic.GetOrganisationWasDissolvedBeforeCurrentAccountingYear(dbOrg))
                        {
                            dnbOrg.ImportedDate = VirtualDateTime.Now;
                            dnbChanges++;
                            continue;
                        }
                        else if (dbOrg.OrganisationName != orgName.Name)
                        {
                            var oldOrgName = dbOrg.GetLatestName();
                            if (oldOrgName == null ||
                                _SharedBusinessLogic.SourceComparer.CanReplace(orgName.Source, oldOrgName.Source))
                            {
                                dbOrg.OrganisationName = orgName.Name;
                                dbOrg.OrganisationNames.Add(orgName);
                                dbChanged = true;
                            }
                        }

                        //Ensure D&B gas an organisationID
                        if (dnbOrg.OrganisationId == null || dnbOrg.OrganisationId.Value == 0)
                        {
                            dnbOrg.OrganisationId = dbOrg.OrganisationId;
                            dnbChanges++;
                        }

                        //Add the cessation date
                        if (dbOrg.DateOfCessation == null && dbOrg.DateOfCessation != dnbOrg.DateOfCessation)
                        {
                            dbOrg.DateOfCessation = dnbOrg.DateOfCessation;
                            dbChanged             = true;
                        }

                        //Set the employer reference
                        if (string.IsNullOrWhiteSpace(dbOrg.EmployerReference))
                        {
                            string employerReference;
                            do
                            {
                                employerReference = _OrganisationBusinessLogic.GenerateEmployerReference();
                            } while (employerReferences.Contains(employerReference));

                            dbOrg.EmployerReference = employerReference;
                            employerReferences.Add(employerReference);
                            dbChanged = true;
                        }

                        if (dnbOrg.EmployerReference != dbOrg.EmployerReference)
                        {
                            dnbOrg.EmployerReference = dbOrg.EmployerReference;
                            dnbChanges++;
                        }

                        //Add the new address
                        var fullAddress = dnbOrg.GetAddress();
                        var newAddress  = dbOrg.LatestAddress;

                        //add the address if there isnt one
                        dataSource = string.IsNullOrWhiteSpace(dnbOrg.AddressSource) ? "D&B" : dnbOrg.AddressSource;
                        if (newAddress == null ||
                            !newAddress.GetAddressString().EqualsI(fullAddress) &&
                            _SharedBusinessLogic.SourceComparer.CanReplace(dataSource, newAddress.Source))
                        {
                            var statusDate = VirtualDateTime.Now;

                            newAddress = new OrganisationAddress();
                            newAddress.Organisation    = dbOrg;
                            newAddress.CreatedByUserId = currentUserId;
                            newAddress.Address1        = dnbOrg.AddressLine1;
                            newAddress.Address2        = dnbOrg.AddressLine2;
                            newAddress.Address3        = dnbOrg.AddressLine3;
                            newAddress.County          = dnbOrg.County;
                            newAddress.Country         = dnbOrg.Country;
                            newAddress.TownCity        = dnbOrg.City;
                            newAddress.PostCode        = dnbOrg.PostalCode;
                            newAddress.PoBox           = dnbOrg.PoBox;
                            newAddress.Source          = dataSource;
                            newAddress.SetStatus(AddressStatuses.Active, currentUserId, "Imported from D&B");
                            if (dbOrg.LatestAddress != null)
                            {
                                dbOrg.LatestAddress.SetStatus(AddressStatuses.Retired, currentUserId,
                                                              $"Replaced by {newAddress.Source}");
                            }
                        }

                        //Update the sic codes
                        var newCodeIds   = dnbOrg.GetSicCodesIds();
                        var newCodesList = dnbOrg.GetSicCodesIds().ToList();
                        for (var i = 0; i < newCodesList.Count; i++)
                        {
                            var code = newCodesList[i];
                            if (code <= 0)
                            {
                                continue;
                            }

                            var sicCode = allSicCodes.FirstOrDefault(sic => sic.SicCodeId == code);
                            if (sicCode != null)
                            {
                                continue;
                            }

                            sicCode = allSicCodes.FirstOrDefault(
                                sic => sic.SicCodeId == code * 10 && sic.Description.EqualsI(dnbOrg.SicDescription));
                            if (sicCode != null)
                            {
                                newCodesList[i] = sicCode.SicCodeId;
                            }
                        }

                        newCodeIds = new SortedSet <int>(newCodesList);

                        var newCodes     = new List <OrganisationSicCode>();
                        var oldCodes     = dbOrg.GetLatestSicCodes().ToList();
                        var oldSicSource = dbOrg.GetLatestSicSource();
                        var oldCodeIds   = oldCodes.Select(s => s.SicCodeId);
                        if (dbOrg.SectorType == SectorTypes.Public)
                        {
                            newCodeIds.Add(1);
                        }

                        if (!_SharedBusinessLogic.SharedOptions.IsProduction())
                        {
                            Debug.WriteLine(
                                $"OLD:{oldCodes.Select(s => s.SicCodeId).ToDelimitedString()} NEW:{newCodeIds.ToDelimitedString()}");
                        }

                        dataSource = string.IsNullOrWhiteSpace(dnbOrg.SicSource) ? "D&B" : dnbOrg.SicSource;
                        if (!newCodeIds.SetEquals(oldCodeIds) &&
                            _SharedBusinessLogic.SourceComparer.CanReplace(dataSource, oldSicSource))
                        {
                            foreach (var code in newCodeIds)
                            {
                                if (code <= 0)
                                {
                                    continue;
                                }

                                var sicCode = allSicCodes.FirstOrDefault(sic => sic.SicCodeId == code);
                                var newSic  = new OrganisationSicCode
                                {
                                    Organisation = dbOrg, SicCodeId = code, Source = dataSource
                                };
                                if (sicCode == null)
                                {
                                    allBadSicCodes.Add(newSic);
                                    continue;
                                }

                                newCodes.Add(newSic);
                            }

                            if (newCodes.Any())
                            {
                                //Add new codes only
                                foreach (var newSic in newCodes)
                                {
                                    dbOrg.OrganisationSicCodes.Add(newSic);
                                    dbChanged = true;
                                }

                                //Retire the old codes
                                foreach (var oldSic in oldCodes)
                                {
                                    oldSic.Retired = VirtualDateTime.Now;
                                    dbChanged      = true;
                                }
                            }
                        }

                        await _SharedBusinessLogic.DataRepository.BeginTransactionAsync(
                            async() =>
                        {
                            try
                            {
                                //Save the name, Sic, EmployerReference, DateOfCessasion changes
                                if (dbChanged)
                                {
                                    await _SharedBusinessLogic.DataRepository.SaveChangesAsync();
                                }

                                //Save the changes
                                dnbOrg.ImportedDate = VirtualDateTime.Now;
                                dnbChanges++;
                                var insert = false;
                                if (dbOrg.OrganisationId == 0)
                                {
                                    _SharedBusinessLogic.DataRepository.Insert(dbOrg);
                                    await _SharedBusinessLogic.DataRepository.SaveChangesAsync();
                                    dbChanged = true;
                                    insert    = true;
                                }

                                if (newAddress != null && newAddress.AddressId == 0)
                                {
                                    dbOrg.OrganisationAddresses.Add(newAddress);
                                    dbOrg.LatestAddress = newAddress;
                                    await _SharedBusinessLogic.DataRepository.SaveChangesAsync();
                                    dbChanged = true;
                                }

                                if (dbChanged)
                                {
                                    dbChanges++;
                                    _SharedBusinessLogic.DataRepository.CommitTransaction();
                                    totalChanges++;
                                    if (insert)
                                    {
                                        totalInserts++;
                                    }

                                    //Add or remove this organisation to/from the search index
                                    await SearchBusinessLogic.UpdateSearchIndexAsync(dbOrg);
                                }
                            }
                            catch
                            {
                                _SharedBusinessLogic.DataRepository.RollbackTransaction();
                            }
                        });

                        c++;
                    }

                    //Reload all the changes
                    if (dbChanges > 0)
                    {
                        dbOrgs = await _SharedBusinessLogic.DataRepository.GetAll <Organisation>().ToListAsync();
                    }

                    //Save the D&B records
                    if (dnbChanges > 0)
                    {
                        await _SharedBusinessLogic.FileRepository.SaveCSVAsync(AllDnBOrgs, dnbOrgsPath);

                        AllDnBOrgs = await _SharedBusinessLogic.FileRepository.ReadCSVAsync <DnBOrgsModel>(dnbOrgsPath);

                        AllDnBOrgs = AllDnBOrgs.OrderBy(o => o.OrganisationName).ToList();
                        dnbOrgs    = AllDnBOrgs.Where(o => o.ImportedDate == null || o.ImportedDate < o.StatusCheckedDate)
                                     .ToList();
                    }

                    //Save the bad sic codes
                    if (allBadSicCodes.Count > 0)
                    {
                        //Create the logging tasks
                        var badSicLoggingtasks = new List <Task>();
                        allBadSicCodes.ForEach(
                            bsc => badSicLoggingtasks.Add(
                                _BadSicLog.WriteAsync(
                                    new BadSicLogModel
                        {
                            OrganisationId   = bsc.Organisation.OrganisationId,
                            OrganisationName = bsc.Organisation.OrganisationName,
                            SicCode          = bsc.SicCodeId,
                            Source           = bsc.Source
                        })));

                        //Wait for all the logging tasks to complete
                        await Task.WhenAll(badSicLoggingtasks);
                    }
                }
            }
            catch (Exception ex)
            {
                error = ex.Message;
                throw;
            }
            finally
            {
                if (!string.IsNullOrWhiteSpace(userEmail))
                {
                    var endTime  = VirtualDateTime.Now;
                    var duration = endTime - startTime;
                    try
                    {
                        if (!string.IsNullOrWhiteSpace(error))
                        {
                            await _Messenger.SendMessageAsync(
                                "D&B Import Failed",
                                userEmail,
                                $"The D&B import failed at {endTime} after {duration.ToFriendly()}.\nChanged {totalChanges} organisations including {totalInserts} new.\n\nERROR:{error}");
                        }
                        else if (totalChanges == 0)
                        {
                            await _Messenger.SendMessageAsync(
                                "D&B Import Complete",
                                userEmail,
                                "The D&B import process completed successfully with no records requiring import.");
                        }
                        else
                        {
                            await _Messenger.SendMessageAsync(
                                "D&B Import Complete",
                                userEmail,
                                $"The D&B import process completed successfully at {endTime} after {duration.ToFriendly()}.\nChanged {totalChanges} organisations including {totalInserts} new.");
                        }
                    }
                    catch (Exception ex)
                    {
                        log.LogError(ex, ex.Message);
                    }
                }

                RunningJobs.Remove(nameof(DnBImportAsync));
            }
        }
        public void RegistrationController_AddAddress_POST_AuthorisedNoAddress_ToConfirm()
        {
            //ARRANGE:
            //1.Arrange the test setup variables
            var user = new User {
                UserId = 1, EmailAddress = "*****@*****.**", EmailVerifiedDate = VirtualDateTime.Now
            };

            var address0 = new OrganisationAddress {
                AddressId = 1,
                Status    = AddressStatuses.Active,
                Source    = "CoHo",
                Address1  = "123",
                Address2  = "evergreen terrace",
                Address3  = "Westminster",
                TownCity  = "City1",
                County    = "County1",
                Country   = "United Kingdom",
                PoBox     = "PoBox 12",
                PostCode  = "W1 5qr"
            };

            var sicCode1 = new SicCode {
                SicCodeId = 2100, Description = "Desc1", SicSection = new SicSection {
                    SicSectionId = "4321", Description = "Section1"
                }
            };
            var sicCode2 = new SicCode {
                SicCodeId = 10520, Description = "Desc2", SicSection = new SicSection {
                    SicSectionId = "4326", Description = "Section2"
                }
            };
            var org0 = new Core.Entities.Organisation {
                OrganisationId   = 1,
                OrganisationName = "Company1",
                SectorType       = SectorTypes.Private,
                Status           = OrganisationStatuses.Active,
                CompanyNumber    = "12345678"
            };

            org0.OrganisationAddresses.Add(address0);
            var name = new OrganisationName {
                OrganisationNameId = 1,
                Name           = org0.OrganisationName,
                Created        = org0.Created,
                Organisation   = org0,
                OrganisationId = org0.OrganisationId
            };

            org0.OrganisationNames.Add(name);
            var sic1 = new OrganisationSicCode {
                SicCode        = sicCode1,
                SicCodeId      = 2100,
                Created        = org0.Created,
                Organisation   = org0,
                OrganisationId = org0.OrganisationId
            };

            org0.OrganisationSicCodes.Add(sic1);
            var sic2 = new OrganisationSicCode {
                SicCode        = sicCode2,
                SicCodeId      = 10520,
                Created        = org0.Created,
                Organisation   = org0,
                OrganisationId = org0.OrganisationId
            };

            org0.OrganisationSicCodes.Add(sic2);

            //Set user email address verified code and expired sent date
            var routeData = new RouteData();

            routeData.Values.Add("Action", nameof(RegistrationController.AddAddress));
            routeData.Values.Add("Controller", "Registration");

            var controller = UiTestHelper.GetController <RegistrationController>(user.UserId, routeData, user, org0, address0, name, sic1, sic2);

            var employerResult = new PagedResult <EmployerRecord>();

            employerResult.Results = new List <EmployerRecord> {
                EmployerRecord.Create(org0)
            };

            //use the include and exclude functions here to save typing
            var model = new OrganisationViewModel {
                NoReference           = false,
                SearchText            = "Searchtext",
                ManualAddress         = true,
                SelectedAuthorised    = true,
                ManualRegistration    = false,
                SectorType            = SectorTypes.Public,
                PINExpired            = false,
                PINSent               = false,
                SelectedEmployerIndex = 0,
                Employers             = employerResult, //0 record returned
                ManualEmployers       = new List <EmployerRecord>(),
                ManualEmployerIndex   = -1,
                AddressReturnAction   = nameof(RegistrationController.ConfirmOrganisation),
                ConfirmReturnAction   = nameof(RegistrationController.ChooseOrganisation)
            };


            //Stash the object for the unstash to happen in code
            controller.StashModel(model);

            OrganisationViewModel savedModel = model.GetClone();

            savedModel.Address1 = "Unit 2";
            savedModel.Address2 = "Bank Road";
            savedModel.Address3 = "Essex";
            savedModel.Postcode = "PoStCode 13";
            controller.Bind(savedModel);

            //Set the expected model
            OrganisationViewModel expectedModel = savedModel.GetClone();

            expectedModel.AddressSource       = user.EmailAddress;
            expectedModel.ConfirmReturnAction = nameof(RegistrationController.AddAddress);

            //ACT:
            var result = controller.AddAddress(savedModel) as RedirectToActionResult;

            //ASSERTS:
            //3.Check that the result is not null
            Assert.NotNull(result, "Expected RedirectToActionResult");

            //4.Check that the redirection went to the right url step.
            Assert.That(result.ActionName == nameof(RegistrationController.ConfirmOrganisation), "Redirected to the wrong view");

            //5.If the redirection successfull retrieve the model stash sent with the redirect.
            var unstashedModel = controller.UnstashModel <OrganisationViewModel>();

            //6.Check that the unstashed model is not null
            Assert.NotNull(unstashedModel, "Expected OrganisationViewModel");

            //Check model is same as expected
            expectedModel.Compare(unstashedModel);
        }
Пример #18
0
        /*
         * public void CreateEnquiryCase(string orgName, string contactName, string team, string status, string priority, string triageLevel, string caseOrigin, string subject, string description)
         * {
         *  WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(50));
         *  wait.Until(ExpectedConditions.ElementToBeClickable(_txtOrganisationName));
         *  OrganisationName.Clear();
         *  OrganisationName.SendKeys(orgName);
         *  Thread.Sleep(2000);
         *  wait.Until(ExpectedConditions.ElementToBeClickable(_txtContactName));
         *  ContactName.Clear();
         *  ContactName.SendKeys(contactName);
         *  Thread.Sleep(2000);
         *
         *  if (Team.Displayed)
         *  {
         *      Team.Click();
         *      var x2 = team;
         *      var x1 = "//*[contains(text(),'";
         *      var x3 = "')]";
         *      Thread.Sleep(3000);
         *      driver.FindElement(By.XPath(x1 + x2 + x3)).Click();
         *
         *  }
         *  else
         *  {
         *      throw new Exception("Team could not be selected");
         *  }
         *  if (CaseStatus.Displayed == true)
         *  {
         *      CaseStatus.Click();
         *      var x2 = status;
         *      var x1 = "//*[contains(text(),'";
         *      var x3 = "')]";
         *      Thread.Sleep(3000);
         *      driver.FindElement(By.XPath(x1 + x2 + x3)).Click();
         *
         *  }
         *  else
         *  {
         *      throw new Exception("Status List could not be selected");
         *  }
         *  if (CasePriority.Displayed)
         *  {
         *      CasePriority.Click();
         *      var x2 = priority;
         *      var x1 = "//*[contains(text(),'";
         *      var x3 = "')]";
         *      Thread.Sleep(3000);
         *      driver.FindElement(By.XPath(x1 + x2 + x3)).Click();
         *
         *  }
         *  else
         *  {
         *      throw new Exception("Case Priority could not be selected");
         *  }
         *
         *  wait.Until(ExpectedConditions.ElementToBeClickable(_txtTriageLevel));
         *  TriageLevel.Clear();
         *  TriageLevel.SendKeys(triageLevel);
         *  Thread.Sleep(2000);
         *
         *  if (CaseOrigin.Displayed)
         *  {
         *      CaseOrigin.Click();
         *      var x2 = caseOrigin;
         *      var x1 = "//*[contains(text(),'";
         *      var x3 = "')]";
         *      Thread.Sleep(3000);
         *      driver.FindElement(By.XPath(x1 + x2 + x3)).Click();
         *
         *  }
         *  else
         *  {
         *      throw new Exception("Case Origin could not be selected");
         *  }
         *
         *  wait.Until(ExpectedConditions.ElementToBeClickable(_txtSubject));
         *  Subject.Clear();
         *  Subject.SendKeys(subject);
         *  Thread.Sleep(2000);
         *
         *  wait.Until(ExpectedConditions.ElementToBeClickable(_txtDescription));
         *  Description.Clear();
         *  Description.SendKeys(description);
         *  Thread.Sleep(2000);
         *
         * }
         */
        public void CreateTechSupportCase(string orgName, string contactName, string technologyTeam, string caseOrigin, string workflow, string category, string status, string priority, string supportClassification, string SCLevel1, string SCLevel2, string subject, string description)
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(50));

            wait.Until(ExpectedConditions.ElementToBeClickable(_txtOrganisationName));
            OrganisationName.Clear();
            OrganisationName.SendKeys(orgName);
            Thread.Sleep(2000);

            wait.Until(ExpectedConditions.ElementToBeClickable(_txtContactName));
            ContactName.Clear();
            ContactName.SendKeys(contactName);
            Thread.Sleep(2000);

            if (TechnologyTeam.Displayed)
            {
                TechnologyTeam.Click();
                var x2 = technologyTeam;
                var x1 = "//*[contains(text(),'";
                var x3 = "')]";
                Thread.Sleep(3000);
                driver.FindElement(By.XPath(x1 + x2 + x3)).Click();
            }
            else
            {
                throw new Exception("Team could not be selected");
            }

            IWebElement   dropDownOriginListBox = driver.FindElement(_listCaseOrigin);
            SelectElement clickOrigin           = new SelectElement(dropDownOriginListBox);

            //Thread.Sleep(2000);
            clickOrigin.SelectByText(caseOrigin);
            //Thread.Sleep(2000);

            IWebElement   dropDownWorkFlowListBox = driver.FindElement(_listWorkflow);
            SelectElement clickWorkFlow           = new SelectElement(dropDownWorkFlowListBox);

            //Thread.Sleep(2000);
            clickWorkFlow.SelectByText(workflow);
            //Thread.Sleep(2000);

            IWebElement   dropDownCategoryListBox = driver.FindElement(_listCategory);
            SelectElement clickCategory           = new SelectElement(dropDownCategoryListBox);

            //Thread.Sleep(2000);
            clickCategory.SelectByText(category);
            //Thread.Sleep(2000);

            IWebElement   dropDownStatusListBox = driver.FindElement(_listStatus);
            SelectElement clickStatus           = new SelectElement(dropDownStatusListBox);

            Thread.Sleep(2000);
            clickStatus.SelectByText(status);
            Thread.Sleep(2000);

            if (CasePriority.Displayed)
            {
                CasePriority.Click();
                var x2 = priority;
                var x1 = "//*[contains(text(),'";
                var x3 = "')]";
                Thread.Sleep(3000);
                driver.FindElement(By.XPath(x1 + x2 + x3)).Click();
            }
            else
            {
                throw new Exception("Case Priority could not be selected");
            }

            IWebElement   dropDownSCListBox = driver.FindElement(_listSupportClassification);
            SelectElement clickSC           = new SelectElement(dropDownSCListBox);

            //Thread.Sleep(2000);
            clickSC.SelectByText(supportClassification);
            //Thread.Sleep(2000);

            IWebElement   dropDownSCL1ListBox = driver.FindElement(_listSCLevel1);
            SelectElement clickSCL1           = new SelectElement(dropDownSCL1ListBox);

            //Thread.Sleep(2000);
            clickSCL1.SelectByText(SCLevel1);
            //Thread.Sleep(2000);

            IWebElement   dropDownSCL2ListBox = driver.FindElement(_listSCLevel2);
            SelectElement clickSCL2           = new SelectElement(dropDownSCL2ListBox);

            //Thread.Sleep(2000);
            clickSCL2.SelectByText(SCLevel2);
            //Thread.Sleep(2000);

            wait.Until(ExpectedConditions.ElementToBeClickable(_txtSubject));
            Subject.Clear();
            Subject.SendKeys(subject);
            Thread.Sleep(2000);

            wait.Until(ExpectedConditions.ElementToBeClickable(_txtDescription));
            Description.Clear();
            Description.SendKeys(description);
            Thread.Sleep(2000);
        }