public void SetUp()
        {
            _coordinatesMock = NSubstitute.Substitute.For <IAddressCoordinates>();
            _repoMock        = NSubstitute.Substitute.For <IGenericRepository <CachedAddress> >();
            _repoMock.AsQueryable().ReturnsForAnyArgs(new List <CachedAddress>()
            {
                new CachedAddress()
                {
                    StreetName   = "Jens Baggesens Vej",
                    StreetNumber = "44",
                    ZipCode      = 8210,
                    Town         = "Aarhus V",
                    IsDirty      = true,
                    DirtyString  = "Jens Baggesens Vej 44, 8210 Aarhus V"
                },
                new CachedAddress()
                {
                    StreetName   = "Katrinebjergvej",
                    StreetNumber = "93b",
                    ZipCode      = 8200,
                    Town         = "Aarhus N",
                    IsDirty      = false,
                    DirtyString  = "Katrinebjergvej 93b, 8200 Aarhus N"
                }
            }.AsQueryable());

            _laundryMock = NSubstitute.Substitute.For <IAddressLaunderer>();
            _laundryMock.WhenForAnyArgs(x => x.Launder(new Address())).DoNotCallBase();



            _uut = new CachedAddressLaunderer(_repoMock, _laundryMock, _coordinatesMock);
        }
예제 #2
0
        public APIService(
            IGenericRepository <OrgUnit> orgUnitRepo,
            IGenericRepository <CachedAddress> cachedRepo,
            IAddressLaunderer actualLaunderer,
            IAddressCoordinates coordinates,
            IGenericRepository <Person> personRepo,
            ISubstituteService subService,
            IGenericRepository <Substitute> subRepo,
            IGenericRepository <Report> reportRepo,
            IReportService <Report> reportService,
            ILogger <APIService> logger
            )
        {
            _orgUnitRepo     = orgUnitRepo;
            _cachedRepo      = cachedRepo;
            _actualLaunderer = actualLaunderer;
            _coordinates     = coordinates;
            _personRepo      = personRepo;
            _subService      = subService;
            _subRepo         = subRepo;
            _reportRepo      = reportRepo;
            _reportService   = reportService;
            _logger          = logger;

            _launderer = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);

            // manually handle changes on these large datasets to improve performance
            _orgUnitRepo.SetChangeTrackingEnabled(false);
            _personRepo.SetChangeTrackingEnabled(false);
            _subRepo.SetChangeTrackingEnabled(false);
            _reportRepo.SetChangeTrackingEnabled(false);
        }
예제 #3
0
        public WorkAddress GetWorkAddressIDM(IDMOrganisation org)
        {
            var launderer = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);

            if (org.Vejnavn == null || org.Vejnavn == "")
            {
                return(null);
            }

            var splitStreetAddress = SplitAddressIDM(org.Vejnavn, org.PostNr, org.PostDistrikt);

            var addressToLaunder = new Address
            {
                StreetName   = splitStreetAddress.ElementAt(0),
                StreetNumber = splitStreetAddress.ElementAt(1),
                ZipCode      = Convert.ToInt32(splitStreetAddress.ElementAt(3)),
                Town         = splitStreetAddress.ElementAt(2),
                Description  = org.Navn
            };

            addressToLaunder = launderer.Launder(addressToLaunder);

            var launderedAddress = new WorkAddress()
            {
                StreetName   = addressToLaunder.StreetName,
                StreetNumber = addressToLaunder.StreetNumber,
                ZipCode      = addressToLaunder.ZipCode,
                Town         = addressToLaunder.Town,
                Latitude     = addressToLaunder.Latitude ?? "",
                Longitude    = addressToLaunder.Longitude ?? "",
                Description  = org.Navn
            };

            var existingOrg = _orgRepo.AsQueryable().FirstOrDefault(x => x.OrgOUID.Equals(org.OUID));

            // If the address hasn't changed then set the Id to be the same as the existing one.
            // That way a new address won't be created in the database.
            // If the address is not the same as the existing one,
            // Then the Id will be 0, and a new address will be created in the database.
            if (existingOrg != null &&
                existingOrg.Address != null &&
                existingOrg.Address.StreetName == launderedAddress.StreetName &&
                existingOrg.Address.StreetNumber == launderedAddress.StreetNumber &&
                existingOrg.Address.ZipCode == launderedAddress.ZipCode &&
                existingOrg.Address.Town == launderedAddress.Town &&
                existingOrg.Address.Latitude == launderedAddress.Latitude &&
                existingOrg.Address.Longitude == launderedAddress.Longitude &&
                existingOrg.Address.Description == launderedAddress.Description)
            {
                launderedAddress.Id = (int)existingOrg.AddressId;
            }
            else
            {
                var a = 2;
            }

            return(launderedAddress);
        }
예제 #4
0
        /// <summary>
        /// Gets work address wor organisation.
        /// </summary>
        /// <param name="org"></param>
        /// <returns>WorkAddress</returns>
        public WorkAddress GetWorkAddress(Organisation org)
        {
            var launderer = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);

            if (org.Gade == null)
            {
                return(null);
            }

            var splitStreetAddress = SplitAddressOnNumber(org.Gade);

            var addressToLaunder = new Address
            {
                StreetName   = splitStreetAddress.ElementAt(0),
                StreetNumber = splitStreetAddress.Count > 1 ? splitStreetAddress.ElementAt(1) : "1",
                ZipCode      = org.Postnr ?? 0,
                Town         = org.By,
                Description  = org.Navn
            };

            addressToLaunder = launderer.Launder(addressToLaunder);

            var launderedAddress = new WorkAddress()
            {
                StreetName   = addressToLaunder.StreetName,
                StreetNumber = addressToLaunder.StreetNumber,
                ZipCode      = addressToLaunder.ZipCode,
                Town         = addressToLaunder.Town,
                Latitude     = addressToLaunder.Latitude ?? "",
                Longitude    = addressToLaunder.Longitude ?? "",
                Description  = org.Navn
            };

            var existingOrg = _orgRepo.AsQueryable().FirstOrDefault(x => x.OrgId.Equals(org.LOSOrgId));

            // If the address hasn't changed then set the Id to be the same as the existing one.
            // That way a new address won't be created in the database.
            // If the address is not the same as the existing one,
            // Then the Id will be 0, and a new address will be created in the database.
            if (existingOrg != null &&
                existingOrg.Address != null &&
                existingOrg.Address.StreetName == launderedAddress.StreetName &&
                existingOrg.Address.StreetNumber == launderedAddress.StreetNumber &&
                existingOrg.Address.ZipCode == launderedAddress.ZipCode &&
                existingOrg.Address.Town == launderedAddress.Town &&
                existingOrg.Address.Latitude == launderedAddress.Latitude &&
                existingOrg.Address.Longitude == launderedAddress.Longitude &&
                existingOrg.Address.Description == launderedAddress.Description)
            {
                launderedAddress.Id = existingOrg.AddressId;
            }
            else
            {
                var a = 2;
            }

            return(launderedAddress);
        }
예제 #5
0
        /// <summary>
        /// Gets work address from API Address.
        /// </summary>
        /// <param name="org"></param>
        /// <returns>WorkAddress</returns>
        private WorkAddress GetWorkAddress(APIOrgUnit apiOrgunit)
        {
            var launderer = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);

            if (apiOrgunit.Address?.Street == null)
            {
                return(null);
            }

            var splitStreetAddress = SplitAddressOnNumber(apiOrgunit.Address.Street);

            var addressToLaunder = new Address
            {
                StreetName   = splitStreetAddress.ElementAt(0),
                StreetNumber = splitStreetAddress.Count > 1 ? splitStreetAddress.ElementAt(1) : "1",
                ZipCode      = apiOrgunit.Address.PostalCode,
                Town         = apiOrgunit.Address.City,
                Description  = apiOrgunit.Name
            };

            addressToLaunder = launderer.Launder(addressToLaunder);

            var launderedAddress = new WorkAddress()
            {
                StreetName   = addressToLaunder.StreetName,
                StreetNumber = addressToLaunder.StreetNumber,
                ZipCode      = addressToLaunder.ZipCode,
                Town         = addressToLaunder.Town,
                Latitude     = addressToLaunder.Latitude ?? "",
                Longitude    = addressToLaunder.Longitude ?? "",
                Description  = apiOrgunit.Name
            };

            var existingOrg = _orgUnitRepo.AsNoTracking().FirstOrDefault(x => x.OrgId.Equals(apiOrgunit.Id));

            // If the address hasn't changed then set the Id to be the same as the existing one.
            // That way a new address won't be created in the database.
            // If the address is not the same as the existing one,
            // Then the Id will be 0, and a new address will be created in the database.
            if (existingOrg != null &&
                existingOrg.Address != null &&
                existingOrg.Address.StreetName == launderedAddress.StreetName &&
                existingOrg.Address.StreetNumber == launderedAddress.StreetNumber &&
                existingOrg.Address.ZipCode == launderedAddress.ZipCode &&
                existingOrg.Address.Town == launderedAddress.Town &&
                existingOrg.Address.Latitude == launderedAddress.Latitude &&
                existingOrg.Address.Longitude == launderedAddress.Longitude &&
                existingOrg.Address.Description == launderedAddress.Description)
            {
                launderedAddress.Id = existingOrg.AddressId;
            }
            return(launderedAddress);
        }
예제 #6
0
        public APIService(IServiceProvider provider)
        {
            _orgUnitRepo           = provider.GetService <IGenericRepository <OrgUnit> >();
            _cachedRepo            = provider.GetService <IGenericRepository <CachedAddress> >();
            _actualLaunderer       = provider.GetService <IAddressLaunderer>();
            _coordinates           = provider.GetService <IAddressCoordinates>();;
            _personRepo            = provider.GetService <IGenericRepository <Person> >();;
            _subService            = provider.GetService <ISubstituteService>();;
            _subRepo               = provider.GetService <IGenericRepository <Substitute> >();;
            _reportRepo            = provider.GetService <IGenericRepository <DriveReport> >();;
            _driveService          = provider.GetService <IDriveReportService>();;
            _logger                = provider.GetService <ILogger <APIService> >();;
            _launderer             = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);
            _addressHistoryService = provider.GetService <AddressHistoryService>();
            _configuration         = provider.GetService <IConfiguration>();

            // manually handle changes on these large datasets to improve performance
            _orgUnitRepo.SetChangeTrackingEnabled(false);
            _personRepo.SetChangeTrackingEnabled(false);
            _subRepo.SetChangeTrackingEnabled(false);
            _reportRepo.SetChangeTrackingEnabled(false);
        }
예제 #7
0
        /// <summary>
        /// Updates home address for person identified by personId.
        /// </summary>
        /// <param name="empl"></param>
        /// <param name="personId"></param>
        public void UpdateHomeAddressIDM(IDMEmployee empl, string cpr)
        {
            try
            {
                if (empl.Vejnavn == null || empl.Vejnavn == "")
                {
                    return;
                }

                var person = _personRepo.AsQueryable().FirstOrDefault(x => x.CprNumber == cpr);
                if (person == null)
                {
                    throw new Exception("Person does not exist.");
                }

                var launderer = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);

                var splitStreetAddress = SplitAddressIDM(empl.Vejnavn, empl.PostNr, empl.PostDistrikt);

                var addressToLaunder = new Address
                {
                    Description  = person.FirstName + " " + person.LastName + " [" + person.Initials + "]",
                    StreetName   = splitStreetAddress.ElementAtOrDefault(0),
                    StreetNumber = splitStreetAddress.ElementAtOrDefault(1) ?? "",
                    ZipCode      = Convert.ToInt32(splitStreetAddress.ElementAtOrDefault(3) ?? "9999"),
                    Town         = splitStreetAddress.ElementAtOrDefault(2) ?? ""
                };
                addressToLaunder = launderer.Launder(addressToLaunder);

                var launderedAddress = new PersonalAddress()
                {
                    PersonId     = person.Id,
                    Type         = PersonalAddressType.Home,
                    StreetName   = addressToLaunder.StreetName,
                    StreetNumber = addressToLaunder.StreetNumber,
                    ZipCode      = addressToLaunder.ZipCode,
                    Town         = addressToLaunder.Town,
                    Latitude     = addressToLaunder.Latitude ?? "",
                    Longitude    = addressToLaunder.Longitude ?? "",
                    Description  = addressToLaunder.Description
                };

                var homeAddr = _personalAddressRepo.AsQueryable().FirstOrDefault(x => x.PersonId.Equals(person.Id) &&
                                                                                 x.Type == PersonalAddressType.Home);

                if (homeAddr == null)
                {
                    _personalAddressRepo.Insert(launderedAddress);
                }
                else
                {
                    if (homeAddr != launderedAddress)
                    {
                        // Address has changed
                        // Change type of current (The one about to be changed) home address to OldHome.
                        // Is done in loop because there was an error that created one or more home addresses for the same person.
                        // This will make sure all home addresses are set to old if more than one exists.
                        foreach (var addr in _personalAddressRepo.AsQueryable().Where(x => x.PersonId.Equals(person.Id) && x.Type == PersonalAddressType.Home).ToList())
                        {
                            addr.Type = PersonalAddressType.OldHome;;
                        }

                        // Update actual current home address.
                        _personalAddressRepo.Insert(launderedAddress);
                        _personalAddressRepo.Save();
                    }
                }
            }
            catch (Exception e)
            {
                _logger.Error($"{this.GetType().Name}, UpdateHomeAddressIDM(), Error when updating address for CPR={cpr}", e);
                throw;
            }
        }
예제 #8
0
        /// <summary>
        /// Updates home address for person identified by personId.
        /// </summary>
        /// <param name="empl"></param>
        /// <param name="personId"></param>
        public void UpdateHomeAddress(Employee empl, int personId)
        {
            if (empl.Adresse == null)
            {
                return;
            }

            var person = _personRepo.AsQueryable().FirstOrDefault(x => x.Id == personId);

            if (person == null)
            {
                _logger.Error($"{this.GetType().Name}, UpdateHomeAddress(), Person does not exist. personId={personId}, MaNr={empl.MaNr}");
                throw new Exception("Person does not exist.");
            }

            var launderer = new CachedAddressLaunderer(_cachedRepo, _actualLaunderer, _coordinates);

            List <string> splitStreetAddress = null;

            try
            {
                splitStreetAddress = SplitAddressOnNumber(empl.Adresse);
            }
            catch (Exception e)
            {
                _logger.Error($"{this.GetType().Name}, UpdateHomeAddress(), Error when splitting address. personId={personId}, address={empl.Adresse}", e);
                throw;
            }

            var addressToLaunder = new Address
            {
                Description  = person.FirstName + " " + person.LastName + " [" + person.Initials + "]",
                StreetName   = splitStreetAddress.ElementAt(0),
                StreetNumber = splitStreetAddress.Count > 1 ? splitStreetAddress.ElementAt(1) : "1",
                ZipCode      = empl.PostNr ?? 0,
                Town         = empl.By ?? "",
            };

            addressToLaunder = launderer.Launder(addressToLaunder);

            var launderedAddress = new PersonalAddress()
            {
                PersonId     = personId,
                Type         = PersonalAddressType.Home,
                StreetName   = addressToLaunder.StreetName,
                StreetNumber = addressToLaunder.StreetNumber,
                ZipCode      = addressToLaunder.ZipCode,
                Town         = addressToLaunder.Town,
                Latitude     = addressToLaunder.Latitude ?? "",
                Longitude    = addressToLaunder.Longitude ?? "",
                Description  = addressToLaunder.Description
            };

            var homeAddr = _personalAddressRepo.AsQueryable().FirstOrDefault(x => x.PersonId.Equals(personId) &&
                                                                             x.Type == PersonalAddressType.Home);

            if (homeAddr == null)
            {
                _personalAddressRepo.Insert(launderedAddress);
            }
            else
            {
                if (homeAddr != launderedAddress)
                {
                    // Address has changed
                    // Change type of current (The one about to be changed) home address to OldHome.
                    // Is done in loop because there was an error that created one or more home addresses for the same person.
                    // This will make sure all home addresses are set to old if more than one exists.
                    foreach (var addr in _personalAddressRepo.AsQueryable().Where(x => x.PersonId.Equals(personId) && x.Type == PersonalAddressType.Home).ToList())
                    {
                        addr.Type = PersonalAddressType.OldHome;;
                    }

                    // Update actual current home address.
                    _personalAddressRepo.Insert(launderedAddress);
                    _personalAddressRepo.Save();
                }
            }
        }