public void UpdateHomeAddress(APIPerson apiPerson, ref Person person)
        {
            if (apiPerson.Address == null)
            {
                _logger.LogWarning($"No home address supplied for {apiPerson.FirstName} {apiPerson.LastName}");
                return;
            }
            var splitStreetAddress = SplitAddressOnNumber(apiPerson.Address.Street);
            var apiAddress         = new Address
            {
                Description  = person.FullName,
                StreetName   = splitStreetAddress.ElementAt(0),
                StreetNumber = splitStreetAddress.Count > 1 ? splitStreetAddress.ElementAt(1) : "1",
                ZipCode      = apiPerson.Address.PostalCode,
                Town         = apiPerson.Address.City ?? "",
            };

            apiAddress = _launderer.Launder(apiAddress);
            var apiPersonalAddress = new PersonalAddress()
            {
                PersonId     = person.Id,
                Type         = PersonalAddressType.Home,
                StreetName   = apiAddress.StreetName,
                StreetNumber = apiAddress.StreetNumber,
                ZipCode      = apiAddress.ZipCode,
                Town         = apiAddress.Town,
                Latitude     = apiAddress.Latitude ?? "",
                Longitude    = apiAddress.Longitude ?? "",
                Description  = apiAddress.Description
            };
            var homeAddress = person.PersonalAddresses.Where(a => a.Type == PersonalAddressType.Home).FirstOrDefault();

            if (homeAddress == null)
            {
                person.PersonalAddresses.Add(apiPersonalAddress);
            }
            else if (homeAddress != apiPersonalAddress)
            {
                homeAddress.Type = PersonalAddressType.OldHome;
                person.PersonalAddresses.Add(apiPersonalAddress);
            }
        }
        public void UpdateAddressHistories_WithTwoActiveHistories_ChangesInOneHomeAddressOneWorkAddress_ShouldDeactivateBothHistories()
        {
            var homeAddress1 = new PersonalAddress
            {
                StreetName   = "TestStreetHome",
                StreetNumber = "1",
                ZipCode      = 1234,
                Town         = "TestTown",
                Latitude     = "1234",
                Longitude    = "1234",
                Type         = PersonalAddressType.Home,
                PersonId     = 1
            };

            var workAddress1 = new WorkAddress
            {
                StreetName   = "TestStreetWork",
                StreetNumber = "1",
                ZipCode      = 1234,
                Town         = "TestTown",
                Latitude     = "1234",
                Longitude    = "1234"
            };

            var homeAddress2 = new PersonalAddress
            {
                StreetName   = "TestStreetHome",
                StreetNumber = "1",
                ZipCode      = 1234,
                Town         = "TestTown",
                Latitude     = "1234",
                Longitude    = "1234",
                Type         = PersonalAddressType.Home,
                PersonId     = 2
            };

            var workAddress2 = new WorkAddress
            {
                StreetName   = "TestStreetWork",
                StreetNumber = "1",
                ZipCode      = 1234,
                Town         = "TestTown",
                Latitude     = "1234",
                Longitude    = "1234"
            };

            var emplRepoMock = NSubstitute.Substitute.For <IGenericRepository <Employment> >();

            emplRepoMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>
            {
                new Employment()
                {
                    Id       = 1,
                    PersonId = 1,
                    OrgUnit  = new OrgUnit()
                    {
                        Address = workAddress1
                    }
                },
                new Employment()
                {
                    Id       = 2,
                    PersonId = 2,
                    OrgUnit  = new OrgUnit()
                    {
                        Address = new WorkAddress
                        {
                            StreetName   = "NewTestStreetWork",
                            StreetNumber = "1",
                            ZipCode      = 1234,
                            Town         = "TestTown",
                            Latitude     = "1234",
                            Longitude    = "1234"
                        }
                    }
                }
            }.AsQueryable());

            var addressHistoryRepoMock = NSubstitute.Substitute.For <IGenericRepository <AddressHistory> >();
            var historyList            = new List <AddressHistory>
            {
                new AddressHistory()
                {
                    EmploymentId = 1,
                    EndTimestamp = 0,
                    Employment   = emplRepoMock.AsQueryable().Single(x => x.Id == 1),
                    WorkAddress  = workAddress1,
                    HomeAddress  = homeAddress1,
                },
                new AddressHistory()
                {
                    EmploymentId = 2,
                    EndTimestamp = 0,
                    Employment   = emplRepoMock.AsQueryable().Single(x => x.Id == 2),
                    WorkAddress  = workAddress2,
                    HomeAddress  = homeAddress2,
                }
            };

            var personalAddressRepoMock = NSubstitute.Substitute.For <IGenericRepository <PersonalAddress> >();

            personalAddressRepoMock.AsQueryable().ReturnsForAnyArgs(new List <PersonalAddress>
            {
                new PersonalAddress
                {
                    StreetName   = "NewTestStreetHome",
                    StreetNumber = "1",
                    ZipCode      = 1234,
                    Town         = "TestTown",
                    Latitude     = "1234",
                    Longitude    = "1234",
                    Type         = PersonalAddressType.Home,
                    PersonId     = 1
                }, homeAddress2
            }.AsQueryable());

            addressHistoryRepoMock.AsQueryable().ReturnsForAnyArgs(historyList.AsQueryable());

            var uut = new AddressHistoryService(emplRepoMock, addressHistoryRepoMock, personalAddressRepoMock);

            uut.UpdateAddressHistories();
            Assert.AreNotEqual(0, historyList.ElementAt(0).EndTimestamp);
            Assert.AreNotEqual(0, historyList.ElementAt(1).EndTimestamp);
        }
        public void UpdateAddressHistories_WithOneActiveHistory_NoChangesInAddress_ShouldNotDeactivate()
        {
            var homeAddress = new PersonalAddress
            {
                StreetName   = "TestStreetHome",
                StreetNumber = "1",
                ZipCode      = 1234,
                Town         = "TestTown",
                Latitude     = "1234",
                Longitude    = "1234",
                Type         = PersonalAddressType.Home,
                PersonId     = 1
            };

            var workAddress = new WorkAddress
            {
                StreetName   = "TestStreetWork",
                StreetNumber = "1",
                ZipCode      = 1234,
                Town         = "TestTown",
                Latitude     = "1234",
                Longitude    = "1234"
            };

            var emplRepoMock = NSubstitute.Substitute.For <IGenericRepository <Employment> >();

            emplRepoMock.AsQueryable().ReturnsForAnyArgs(new List <Employment>
            {
                new Employment()
                {
                    Id       = 1,
                    PersonId = 1,
                    OrgUnit  = new OrgUnit()
                    {
                        Address = workAddress
                    }
                }
            }.AsQueryable());

            var addressHistoryRepoMock = NSubstitute.Substitute.For <IGenericRepository <AddressHistory> >();
            var historyList            = new List <AddressHistory>
            {
                new AddressHistory()
                {
                    EmploymentId = 1,
                    EndTimestamp = 0,
                    Employment   = emplRepoMock.AsQueryable().First(),
                    WorkAddress  = workAddress,
                    HomeAddress  = homeAddress,
                }
            };

            var personalAddressRepoMock = NSubstitute.Substitute.For <IGenericRepository <PersonalAddress> >();

            personalAddressRepoMock.AsQueryable().ReturnsForAnyArgs(new List <PersonalAddress>
            {
                homeAddress
            }.AsQueryable());

            addressHistoryRepoMock.AsQueryable().ReturnsForAnyArgs(historyList.AsQueryable());

            var uut = new AddressHistoryService(emplRepoMock, addressHistoryRepoMock, personalAddressRepoMock);

            uut.UpdateAddressHistories();
            Assert.AreEqual(0, historyList.ElementAt(0).EndTimestamp);
        }
Beispiel #4
0
        public void TransferFromTempToActual()
        {
            var tempRepo            = NinjectWebKernel.CreateKernel().Get <IGenericRepository <TempAddressHistory> >();
            var actualRepo          = NinjectWebKernel.CreateKernel().Get <IGenericRepository <AddressHistory> >();
            var workAddressRepo     = NinjectWebKernel.CreateKernel().Get <IGenericRepository <WorkAddress> >();
            var personalAddressRepo = NinjectWebKernel.CreateKernel().Get <IGenericRepository <PersonalAddress> >();
            var coords   = new AddressCoordinates();
            var emplRepo = NinjectWebKernel.CreateKernel().Get <IGenericRepository <Employment> >();

            var i = 0;

            var rows = tempRepo.AsQueryable().Where(x => !x.WorkIsDirty && !x.HomeIsDirty).ToList();

            foreach (var tempHistory in rows)
            {
                i++;
                Console.WriteLine(i + " of " + rows.Count);
                var currentTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
                var empls            = emplRepo.AsQueryable().Where(x => x.EmploymentId == tempHistory.MaNr).ToList();
                if (empls.Count == 0)
                {
                    continue;;
                }
                var empl = new Employment();
                if (empls.Count == 1)
                {
                    // If only one empl with manr exists just use that
                    empl = empls.First();
                }
                else
                {
                    // If more than one exists then select the active one.
                    // If an active one does not exist then select the one that ended most recently
                    empl = empls.FirstOrDefault(x => x.EndDateTimestamp == 0) ??
                           empls.OrderByDescending(x => x.EndDateTimestamp).First();
                }

                var workTemp = coords.GetAddressCoordinates(new WorkAddress()
                {
                    StreetName   = SplitAddressOnNumber(tempHistory.ArbejdsAdresse)[0],
                    StreetNumber = SplitAddressOnNumber(tempHistory.ArbejdsAdresse)[1],
                    ZipCode      = tempHistory.ArbejdsPostNr,
                    Town         = tempHistory.ArbejdsBy,
                });

                var workAddress = new WorkAddress
                {
                    StreetName   = workTemp.StreetName,
                    StreetNumber = workTemp.StreetNumber,
                    ZipCode      = workTemp.ZipCode,
                    Town         = workTemp.Town,
                    Latitude     = workTemp.Latitude,
                    Longitude    = workTemp.Longitude
                };

                var homeTemp = coords.GetAddressCoordinates(new PersonalAddress
                {
                    StreetName   = SplitAddressOnNumber(tempHistory.HjemmeAdresse)[0],
                    StreetNumber = SplitAddressOnNumber(tempHistory.HjemmeAdresse)[1],
                    ZipCode      = tempHistory.HjemmePostNr,
                    Town         = tempHistory.HjemmeBy,
                });

                var homeAddress = new PersonalAddress()
                {
                    StreetName   = homeTemp.StreetName,
                    StreetNumber = homeTemp.StreetNumber,
                    ZipCode      = homeTemp.ZipCode,
                    Town         = homeTemp.Town,
                    Latitude     = homeTemp.Latitude,
                    Longitude    = homeTemp.Longitude,
                    PersonId     = empl.PersonId,
                    Type         = PersonalAddressType.OldHome,
                };

                workAddressRepo.Insert(workAddress);
                personalAddressRepo.Insert(homeAddress);
                workAddressRepo.Save();
                personalAddressRepo.Save();

                var addressHistory = new Core.DomainModel.AddressHistory
                {
                    WorkAddressId  = workAddress.Id,
                    HomeAddressId  = homeAddress.Id,
                    StartTimestamp = tempHistory.AktivFra,
                    EndTimestamp   = tempHistory.AktivTil,
                    EmploymentId   = empl.Id,
                    IsMigrated     = true,
                };

                actualRepo.Insert(addressHistory);
            }
            actualRepo.Save();
        }
Beispiel #5
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;
            }
        }
Beispiel #6
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();
                }
            }
        }
        public void MigrateHistories()
        {
            var historiesToMigrate  = _provider.GetAddressHistoriesAsQueryable();
            var failedWorkAddresses = new List <string>();
            var failedHomeAddresses = new List <string>();

            var i   = 0;
            var max = historiesToMigrate.Count();

            foreach (var ah in historiesToMigrate)
            {
                if (i % 10 == 0)
                {
                    Console.WriteLine("Migrating AddressHistory " + i + " of " + max + ".");
                }
                i++;

                var currentDateTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

                var employments = _employmentRepo.AsQueryable().Where(x => x.EmploymentId == ah.MaNr);
                var employment  = new Employment();
                if (employments.Count() == 1)
                {
                    employment = employments.First();
                }
                else if (employments.Count() > 1)
                {
                    employment = employments.Single(x => x.EndDateTimestamp == 0 || x.EndDateTimestamp > currentDateTimestamp);
                }


                var homeAddressLookup = new Address();
                var homeAddress       = new PersonalAddress();
                try
                {
                    homeAddressLookup = _coords.GetAddressCoordinates(new Address()
                    {
                        StreetName   = SplitAddressOnNumber(ah.HjemmeAdresse)[0],
                        StreetNumber = SplitAddressOnNumber(ah.HjemmeAdresse)[1],
                        ZipCode      = ah.HjemmePostNr,
                        Town         = ah.HjemmeBy
                    });

                    homeAddress = new PersonalAddress()
                    {
                        Type         = PersonalAddressType.OldHome,
                        PersonId     = employment.PersonId,
                        StreetNumber = homeAddressLookup.StreetNumber,
                        StreetName   = homeAddressLookup.StreetName,
                        Town         = homeAddressLookup.Town,
                        ZipCode      = homeAddressLookup.ZipCode,
                        Latitude     = homeAddressLookup.Latitude,
                        Longitude    = homeAddressLookup.Longitude
                    };

                    homeAddress = _personalAddressRepo.Insert(homeAddress);
                    _personalAddressRepo.Save();
                }
                catch (Exception)
                {
                    failedHomeAddresses.Add(ah.HjemmeAdresse);
                }

                var workAddressLookup = new Address();
                var workAddress       = new WorkAddress();

                try
                {
                    workAddressLookup = _coords.GetAddressCoordinates(new Address()
                    {
                        StreetName   = SplitAddressOnNumber(ah.ArbejdsAdresse)[0],
                        StreetNumber = SplitAddressOnNumber(ah.ArbejdsAdresse)[1],
                        ZipCode      = ah.ArbejdsPostNr,
                        Town         = ah.ArbejdsBy
                    });

                    workAddress = new WorkAddress()
                    {
                        StreetNumber = workAddressLookup.StreetNumber,
                        StreetName   = workAddressLookup.StreetName,
                        Town         = workAddressLookup.Town,
                        ZipCode      = workAddressLookup.ZipCode,
                        Latitude     = workAddressLookup.Latitude,
                        Longitude    = workAddressLookup.Longitude
                    };


                    workAddress = _workAddressRepo.Insert(workAddress);

                    _workAddressRepo.Save();
                }
                catch (Exception)
                {
                    failedWorkAddresses.Add(ah.ArbejdsAdresse);
                }



                var history = new Core.DomainModel.AddressHistory()
                {
                    EmploymentId   = employment.Id,
                    StartTimestamp = (Int32)(ah.AktivFra.Subtract(new DateTime(1970, 1, 1))).TotalSeconds,
                    EndTimestamp   = (Int32)(ah.AktivTil.Subtract(new DateTime(1970, 1, 1))).TotalSeconds,
                    HomeAddressId  = homeAddress.Id,
                    WorkAddressId  = workAddress.Id
                };

                _historyRepo.Insert(history);
            }
            _historyRepo.Save();
        }