Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
else
{
<govuk-inset-text class="govuk-!-margin-top-0">
Differences are <highlight>highlighted</highlight> on the existing records
Details that do not match are <highlight>highlighted</highlight> in the existing records
</govuk-inset-text>
}

Expand All @@ -55,17 +55,10 @@
</govuk-summary-list-row>
}
<govuk-summary-list-row>
<govuk-summary-list-row-key>First name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.RequestData!.FirstName</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Middle name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.RequestData!.MiddleName</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Last name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.RequestData!.LastName</govuk-summary-list-row-value>
<govuk-summary-list-row-key>Name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.Name</govuk-summary-list-row-value>
</govuk-summary-list-row>

@if (showDuplicatesSideBySide)
{
// Add field so the fields line up when viewed side-by-side
Expand Down Expand Up @@ -98,7 +91,7 @@
<h2 class="govuk-heading-m">Potential matches</h2>
}

@foreach (var match in Model.PotentialDuplicates!)
@foreach (var (match, hasNameMismatch) in Model.PotentialDuplicatesWithNameMatchingInfo!)
{
<govuk-summary-card data-testid="match" data-personid="@match.PersonId" class="trs-potential-duplicates__item">
<govuk-summary-card-title heading-level="3">
Expand Down Expand Up @@ -142,23 +135,20 @@
}

<govuk-summary-list-row>
<govuk-summary-list-row-key>First name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!match.MatchedAttributes.Contains(PersonMatchedAttribute.FirstName))">
@match.FirstName
</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Middle name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!(match.MatchedAttributes.Contains(PersonMatchedAttribute.MiddleName) || (string.IsNullOrEmpty(Model.RequestData!.MiddleName) && string.IsNullOrEmpty(match.MiddleName))))">
@match.MiddleName
</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Last name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!match.MatchedAttributes.Contains(PersonMatchedAttribute.LastName))">
@match.LastName
<govuk-summary-list-row-key>Name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@hasNameMismatch">
@StringHelper.JoinNonEmpty(' ', match.FirstName, match.MiddleName, match.LastName)
</govuk-summary-list-row-value>
</govuk-summary-list-row>
@if (match.PreviousNames!.Count > 0)
{
<govuk-summary-list-row>
<govuk-summary-list-row-key>Previous names</govuk-summary-list-row-key>
<govuk-summary-list-row-value>
<list-text-items text-items="@match.PreviousNames"></list-text-items>
</govuk-summary-list-row-value>
</govuk-summary-list-row>
}
<govuk-summary-list-row>
<govuk-summary-list-row-key>TRN</govuk-summary-list-row-key>
<govuk-summary-list-row-value>@match.Trn</govuk-summary-list-row-value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ public class Matches(TrsDbContext dbContext, SupportUiLinkGenerator linkGenerato

public string SourceApplicationUserName => RequestData!.ApplicationUser!.Name;

public string Name => StringHelper.JoinNonEmpty(' ', RequestData!.FirstName, RequestData!.MiddleName, RequestData!.LastName);

private bool HasFirstNameMismatch(PotentialDuplicate pd) =>
((String.IsNullOrEmpty(pd.FirstName) || String.IsNullOrEmpty(RequestData!.FirstName))
? !(String.IsNullOrEmpty(pd.FirstName) && String.IsNullOrEmpty(RequestData!.FirstName))
: pd.HasFirstNameMismatch);
private bool HasMiddleNameMismatch(PotentialDuplicate pd) =>
((String.IsNullOrEmpty(pd.MiddleName) || String.IsNullOrEmpty(RequestData!.MiddleName))
? !(String.IsNullOrEmpty(pd.MiddleName) && String.IsNullOrEmpty(RequestData!.MiddleName))
: pd.HasMiddleNameMismatch);
private bool HasLastNameMismatch(PotentialDuplicate pd) =>
((String.IsNullOrEmpty(pd.LastName) || String.IsNullOrEmpty(RequestData!.LastName))
? !(String.IsNullOrEmpty(pd.LastName) && String.IsNullOrEmpty(RequestData!.LastName))
: pd.HasLastNameMismatch);

public IReadOnlyCollection<(PotentialDuplicate PotentialDuplicate, bool HasNameMismatch)> PotentialDuplicatesWithNameMatchingInfo { get; set; } = Array.Empty<(PotentialDuplicate, bool)>();

public PotentialDuplicate[]? PotentialDuplicates { get; set; }

[BindProperty]
Expand Down Expand Up @@ -105,6 +122,10 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte
Trn = p.Trn,
HasQts = p.QtsDate != null,
HasEyts = p.EytsDate != null,
PreviousNames = p.PreviousNames!
.OrderBy(n => n.CreatedOn)
.Select(n => StringHelper.JoinNonEmpty(' ', n.FirstName, n.MiddleName, n.LastName))
.ToArray(),
HasActiveAlerts = p.Alerts!.Any(a => a.IsOpen)
})
.ToArrayAsync())
Expand All @@ -117,6 +138,11 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte
})
.ToArray();

// highlight name mismatches taking into account whether each name part is present in the request data and the match
PotentialDuplicatesWithNameMatchingInfo = PotentialDuplicates!
.Select(pd => (pd, HasFirstNameMismatch(pd) || HasMiddleNameMismatch(pd) || HasLastNameMismatch(pd)))
.ToArray();

await base.OnPageHandlerExecutionAsync(context, next);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
else
{
<govuk-inset-text class="govuk-!-margin-top-0">
Differences are <highlight>highlighted</highlight> on the existing records
Details that do not match are <highlight>highlighted</highlight> in the existing records
</govuk-inset-text>
}

Expand All @@ -55,16 +55,8 @@
</govuk-summary-list-row>
}
<govuk-summary-list-row>
<govuk-summary-list-row-key>First name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.RequestData!.FirstName</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Middle name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.RequestData!.MiddleName</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Last name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.RequestData!.LastName</govuk-summary-list-row-value>
<govuk-summary-list-row-key>Name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback>@Model.Name</govuk-summary-list-row-value>
</govuk-summary-list-row>
@if (showDuplicatesSideBySide)
{
Expand Down Expand Up @@ -104,7 +96,7 @@
<h2 class="govuk-heading-m">Potential matches</h2>
}

@foreach (var match in Model.PotentialDuplicates!)
@foreach (var (match, hasNameMismatch) in Model.PotentialDuplicatesWithNameMatchingInfo!)
{
<govuk-summary-card data-testid="match" data-personid="@match.PersonId" class="trs-potential-duplicates__item">
<govuk-summary-card-title heading-level="3">
Expand Down Expand Up @@ -148,23 +140,20 @@
}

<govuk-summary-list-row>
<govuk-summary-list-row-key>First name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!match.MatchedAttributes.Contains(PersonMatchedAttribute.FirstName))">
@match.FirstName
</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Middle name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!(match.MatchedAttributes.Contains(PersonMatchedAttribute.MiddleName) || (string.IsNullOrEmpty(Model.RequestData!.MiddleName) && string.IsNullOrEmpty(match.MiddleName))))">
@match.MiddleName
</govuk-summary-list-row-value>
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Last name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!match.MatchedAttributes.Contains(PersonMatchedAttribute.LastName))">
@match.LastName
<govuk-summary-list-row-key>Name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@hasNameMismatch">
@StringHelper.JoinNonEmpty(' ', match.FirstName, match.MiddleName, match.LastName)
</govuk-summary-list-row-value>
</govuk-summary-list-row>
@if (match.PreviousNames!.Count > 0)
{
<govuk-summary-list-row>
<govuk-summary-list-row-key>Previous names</govuk-summary-list-row-key>
<govuk-summary-list-row-value>
<list-text-items text-items="@match.PreviousNames"></list-text-items>
</govuk-summary-list-row-value>
</govuk-summary-list-row>
}
<govuk-summary-list-row>
<govuk-summary-list-row-key>TRN</govuk-summary-list-row-key>
<govuk-summary-list-row-value>@match.Trn</govuk-summary-list-row-value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,23 @@ public class MatchesModel(TrsDbContext dbContext, SupportUiLinkGenerator linkGen

public string SourceApplicationUserName => RequestData!.ApplicationUser!.Name;

public string Name => StringHelper.JoinNonEmpty(' ', RequestData?.FirstName, RequestData?.MiddleName, RequestData?.LastName);

private bool HasFirstNameMismatch(PotentialDuplicate pd) =>
((String.IsNullOrEmpty(pd.FirstName) || String.IsNullOrEmpty(RequestData!.FirstName))
? !(String.IsNullOrEmpty(pd.FirstName) && String.IsNullOrEmpty(RequestData!.FirstName))
: pd.HasFirstNameMismatch);
private bool HasMiddleNameMismatch(PotentialDuplicate pd) =>
((String.IsNullOrEmpty(pd.MiddleName) || String.IsNullOrEmpty(RequestData!.MiddleName))
? !(String.IsNullOrEmpty(pd.MiddleName) && String.IsNullOrEmpty(RequestData!.MiddleName))
: pd.HasMiddleNameMismatch);
private bool HasLastNameMismatch(PotentialDuplicate pd) =>
((String.IsNullOrEmpty(pd.LastName) || String.IsNullOrEmpty(RequestData!.LastName))
? !(String.IsNullOrEmpty(pd.LastName) && String.IsNullOrEmpty(RequestData!.LastName))
: pd.HasLastNameMismatch);

public IReadOnlyCollection<(PotentialDuplicate PotentialDuplicate, bool HasNameMismatch)> PotentialDuplicatesWithNameMatchingInfo { get; set; } = Array.Empty<(PotentialDuplicate, bool)>();

[BindProperty]
public Guid? PersonId { get; set; }

Expand Down Expand Up @@ -101,6 +118,10 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte
Gender = p.Gender,
HasQts = p.QtsDate != null,
HasEyts = p.EytsDate != null,
PreviousNames = p.PreviousNames!
.OrderBy(n => n.CreatedOn)
.Select(n => StringHelper.JoinNonEmpty(' ', n.FirstName, n.MiddleName, n.LastName))
.ToArray(),
HasActiveAlerts = p.Alerts!.Any(a => a.IsOpen)
})
.ToArrayAsync())
Expand All @@ -116,6 +137,10 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte
NpqEvidenceFile = (RequestData?.NpqEvidenceFileId, RequestData?.NpqEvidenceFileName) is (Guid fileId, string fileName)
? new(fileId, fileName) : null;

PotentialDuplicatesWithNameMatchingInfo = PotentialDuplicates!
.Select(pd => (pd, HasFirstNameMismatch(pd) || HasMiddleNameMismatch(pd) || HasLastNameMismatch(pd)))
.ToArray();

await base.OnPageHandlerExecutionAsync(context, next);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
<govuk-summary-list>
<govuk-summary-list-row>
<govuk-summary-list-row-key>Name</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!(match.MatchedAttributeTypes.Contains(PersonMatchedAttribute.FirstName) && match.MatchedAttributeTypes.Contains(PersonMatchedAttribute.LastName)))">@($"{match.FirstName} {match.LastName}")</govuk-summary-list-row-value>
<govuk-summary-list-row-value use-empty-fallback highlight="@match.HasNameMismatch">@($"{match.FirstName} {match.LastName}")</govuk-summary-list-row-value>
</govuk-summary-list-row>
@if (match.PreviousNames!.Count > 0)
{
Expand All @@ -76,7 +76,7 @@
</govuk-summary-list-row>
<govuk-summary-list-row>
<govuk-summary-list-row-key>NI number</govuk-summary-list-row-key>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!match.MatchedAttributeTypes.Contains(PersonMatchedAttribute.NationalInsuranceNumber))">@match.NationalInsuranceNumber</govuk-summary-list-row-value>
<govuk-summary-list-row-value use-empty-fallback highlight="@(!(match.MatchedAttributeTypes.Contains(PersonMatchedAttribute.NationalInsuranceNumber) || (string.IsNullOrEmpty(Model.NationalInsuranceNumber) && string.IsNullOrEmpty(match.NationalInsuranceNumber))))">@match.NationalInsuranceNumber</govuk-summary-list-row-value>
</govuk-summary-list-row>
</govuk-summary-list>
</govuk-summary-card>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public class SuggestedMatchViewModel
public required string? NationalInsuranceNumber { get; init; }
public required IReadOnlyCollection<string>? PreviousNames { get; init; } = [];
public required IReadOnlyCollection<PersonMatchedAttribute> MatchedAttributeTypes { get; init; }

public bool HasNameMismatch => !(MatchedAttributeTypes.Contains(PersonMatchedAttribute.FirstName) && MatchedAttributeTypes.Contains(PersonMatchedAttribute.LastName));
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,10 @@ public record PotentialDuplicate
public required bool HasQts { get; init; }
public required bool HasEyts { get; init; }
public required bool HasActiveAlerts { get; init; }
public required IReadOnlyCollection<string> PreviousNames { get; init; }
public required IReadOnlyCollection<PersonMatchedAttribute> MatchedAttributes { get; init; }

public bool HasFirstNameMismatch => !(String.IsNullOrEmpty(FirstName) || MatchedAttributes.Contains(PersonMatchedAttribute.FirstName));
public bool HasMiddleNameMismatch => !(String.IsNullOrEmpty(MiddleName) || MatchedAttributes.Contains(PersonMatchedAttribute.MiddleName));
public bool HasLastNameMismatch => !(String.IsNullOrEmpty(LastName) || MatchedAttributes.Contains(PersonMatchedAttribute.LastName));
}
Loading