Example #1
0
        public static PersonRelationType[] ToPersonRelationTypeArray(ICivilStatus currentStatus, IList <ICivilStatus> historyCivilStates, Func <string, Guid> cpr2uuidFunc, char marriedStatus, char divorcedStatus, char widowStatus, char deadStatus, bool deadAsSameSex)
        {
            // TODO: Shall we take separation into account?
            char[] maritalStates = new char[] { marriedStatus, divorcedStatus, widowStatus };

            var allCivilStates = new List <ICivilStatus>();

            // Add current status
            allCivilStates.Add(currentStatus);

            // Add historical states
            historyCivilStates = historyCivilStates == null ? new List <ICivilStatus>() : historyCivilStates;
            allCivilStates.AddRange(historyCivilStates);

            // Filter the correct records
            allCivilStates = allCivilStates
                             .Where(h =>
                                    h != null &&
                                    (maritalStates.Contains(h.CivilStatusCode, new CaseInvariantCharComparer()) || h.CivilStatusCode == deadStatus) &&
                                    h.IsValid()
                                    )
                             .OrderBy(civ => civ.ToStartTS())
                             .ToList();

            var ret = new List <PersonRelationType>();

            for (int i = 0; i < allCivilStates.Count; i++)
            {
                var dbCivilStatus        = allCivilStates[i];
                var dbCivilStatusWrapper = new CivilStatusWrapper(dbCivilStatus);

                var previousDbCivilStatus =
                    (i > 0) && (allCivilStates[i - 1].ToEndTS() == dbCivilStatus.ToStartTS()) ?
                    allCivilStates[i - 1] : null;

                if (dbCivilStatus.CivilStatusCode == marriedStatus)
                {
                    ret.Add(dbCivilStatusWrapper.ToPersonRelationType(cpr2uuidFunc));
                }
                else if (previousDbCivilStatus == null) // Statistics show that if previous row exists, it will be always 'married'
                {
                    if (dbCivilStatus.CivilStatusCode == divorcedStatus || dbCivilStatus.CivilStatusCode == widowStatus)
                    {
                        // Only add a relation if the previous row (married) does not exist
                        // Reverse times because we need the 'marriage' interval, not the 'divorce/widow'
                        ret.Add(dbCivilStatusWrapper.ToPersonRelationType(cpr2uuidFunc, true));
                    }
                    else if (dbCivilStatus.CivilStatusCode == deadStatus)
                    {
                        // TODO: Rely on person data to get gender instead of CPR number
                        bool isSameSex = Util.Enums.PersonNumberToGender(dbCivilStatusWrapper._CivilStatus.PNR) == Util.Enums.PersonNumberToGender(dbCivilStatusWrapper.ToSpousePnr());
                        if (isSameSex == deadAsSameSex)
                        {
                            ret.Add(dbCivilStatusWrapper.ToPersonRelationType(cpr2uuidFunc, true));
                        }
                    }
                }
            }
            return(ret.ToArray());
        }
Example #2
0
        /// <summary>
        /// Main purpose of this method is r
        /// - Remove ivalid civil states
        /// - Add a starting 'unmarried' interval if needed (and possible)
        /// </summary>
        /// <param name="currentStatus"></param>
        /// <param name="historyCivilStates"></param>
        /// <param name="singleStatus"></param>
        /// <returns></returns>
        public static List <ICivilStatus> PopulateIntervals(ICivilStatus currentStatus, List <ICivilStatus> historyCivilStates, char singleStatus)
        {
            var allCivilStates = new List <ICivilStatus>();

            // Add current status
            allCivilStates.Add(currentStatus);

            // Add historical states
            historyCivilStates = historyCivilStates == null ? new List <ICivilStatus>() : historyCivilStates;
            allCivilStates.AddRange(historyCivilStates);

            // Filter the correct records
            allCivilStates = allCivilStates
                             .Where(h =>
                                    h != null &&
                                    h.IsValid()
                                    )
                             .OrderBy(civ => civ.ToStartTS())
                             .ToList();

            // Add a dummy 'Single' interval
            if (allCivilStates.Count > 1)
            {
                var firstStatus = allCivilStates.First();
                if (firstStatus.ToStartTS().HasValue&& firstStatus.CivilStatusCode != singleStatus)
                {
                    var dummy = new DummyCivilStatus()
                    {
                        PNR              = firstStatus.PNR,
                        SpousePnr        = null,
                        CivilStatusCode  = singleStatus,
                        StartTS          = null,
                        StartTSCertainty = true,
                        EndTS            = firstStatus.ToStartTS(),
                        EndTSCertainty   = true
                    };
                    allCivilStates.Add(dummy);
                }
            }
            return(allCivilStates);
        }
Example #3
0
 public CivilStatusWrapper(ICivilStatus civil)
 {
     _CivilStatus = civil;
 }
Example #4
0
 public static PersonRelationType[] ToRegisteredPartners(ICivilStatus current, List <ICivilStatus> history, Func <string, Guid> cpr2uuidFunc)
 {
     return(ToPersonRelationTypeArray(current, history, cpr2uuidFunc, MaritalStatus.RegisteredPartnership, MaritalStatus.AbolitionOfRegisteredPartnership, MaritalStatus.LongestLivingPartner, MaritalStatus.Deceased, true));
 }
Example #5
0
 public static PersonRelationType[] ToSpouses(ICivilStatus current, List <ICivilStatus> history, Func <string, Guid> cpr2uuidFunc)
 {
     return(ToPersonRelationTypeArray(current, history, cpr2uuidFunc, MaritalStatus.Married, MaritalStatus.Divorced, MaritalStatus.Widow, MaritalStatus.Deceased, false));
 }