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()); }
/// <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); }
public CivilStatusWrapper(ICivilStatus civil) { _CivilStatus = civil; }
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)); }
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)); }