Skip to content

Commit

Permalink
Added qtlsstatus to vnext getperson
Browse files Browse the repository at this point in the history
  • Loading branch information
MrKevJoy committed Dec 16, 2024
1 parent dbc2969 commit 370d380
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ public record QtsInfo
public required DateOnly Awarded { get; init; }
public required string CertificateUrl { get; init; }
public required string StatusDescription { get; init; }
public required bool? QtlsHasBeenSet { get; init; }

public static async Task<QtsInfo?> CreateAsync(dfeta_qtsregistration? qtsRegistration, ReferenceDataCache referenceDataCache)
public static async Task<QtsInfo?> CreateAsync(dfeta_qtsregistration? qtsRegistration, ReferenceDataCache referenceDataCache, DateTime? qtlsDate, bool? qtlsHasBeenSet)
{
if (qtsRegistration is null)
{
Expand All @@ -23,36 +24,40 @@ public record QtsInfo
}

var teacherStatus = await referenceDataCache.GetTeacherStatusByIdAsync(qtsRegistration.dfeta_TeacherStatusId.Id);
var statusDescription = GetStatusDescription(teacherStatus);
var statusDescription = GetStatusDescription(teacherStatus, qtlsDate);

return new()
{
Awarded = awardedDate!.Value,
CertificateUrl = "/v3/certificates/qts",
StatusDescription = statusDescription,
QtlsHasBeenSet = qtlsHasBeenSet
};
}
private static string GetStatusDescription(dfeta_teacherstatus teacherStatus, DateTime? qtlsDate = null)
=> qtlsDate.HasValue
? "Qualified Teacher Learning and Skills status"
: teacherStatus.dfeta_Value switch
{
"28" => "Qualified",
"50" => "Qualified",
"67" => "Qualified",
"68" => "Qualified",
"69" => "Qualified",
"71" => "Qualified",
"87" => "Qualified",
"90" => "Qualified",
"100" => "Qualified",
"103" => "Qualified",
"104" => "Qualified",
"206" => "Qualified",
"211" => "Trainee teacher",
"212" => "Assessment only route candidate",
"213" => "Qualified",
"214" => "Partial qualified teacher status",
"223" => "Qualified",
_ when teacherStatus.dfeta_name.StartsWith("Qualified teacher", StringComparison.OrdinalIgnoreCase) => "Qualified",
_ => throw new ArgumentException($"Unrecognized QTS status: '{teacherStatus.dfeta_Value}'.", nameof(teacherStatus))
};

private static string GetStatusDescription(dfeta_teacherstatus teacherStatus) => teacherStatus.dfeta_Value switch
{
"28" => "Qualified",
"50" => "Qualified",
"67" => "Qualified",
"68" => "Qualified",
"69" => "Qualified",
"71" => "Qualified",
"87" => "Qualified",
"90" => "Qualified",
"100" => "Qualified",
"103" => "Qualified",
"104" => "Qualified",
"206" => "Qualified",
"211" => "Trainee teacher",
"212" => "Assessment only route candidate",
"213" => "Qualified",
"214" => "Partial qualified teacher status",
"223" => "Qualified",
_ when teacherStatus.dfeta_name.StartsWith("Qualified teacher", StringComparison.OrdinalIgnoreCase) => "Qualified",
_ => throw new ArgumentException($"Unregonized QTS status: '{teacherStatus.dfeta_Value}'.", nameof(teacherStatus))
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ public abstract class FindPersonsHandlerBase(
Contact.Fields.dfeta_StatedFirstName,
Contact.Fields.dfeta_StatedMiddleName,
Contact.Fields.dfeta_StatedLastName,
Contact.Fields.dfeta_InductionStatus);
Contact.Fields.dfeta_InductionStatus,
Contact.Fields.dfeta_qtlsdate,
Contact.Fields.dfeta_QtlsDateHasBeenSet);

protected async Task<FindPersonsResult> CreateResultAsync(IEnumerable<Contact> matched)
{
Expand Down Expand Up @@ -131,7 +133,7 @@ protected async Task<FindPersonsResult> CreateResultAsync(IEnumerable<Contact> m
StatusDescription = inductionStatus.GetDescription()
} :
null,
Qts = await QtsInfo.CreateAsync(qtsRegistrations[r.Id].OrderBy(qr => qr.CreatedOn).FirstOrDefault(s => s.dfeta_QTSDate is not null), referenceDataCache),
Qts = await QtsInfo.CreateAsync(qtsRegistrations[r.Id].OrderBy(qr => qr.CreatedOn).FirstOrDefault(s => s.dfeta_QTSDate is not null), referenceDataCache, r.dfeta_qtlsdate, r.dfeta_QtlsDateHasBeenSet),
Eyts = await EytsInfo.CreateAsync(qtsRegistrations[r.Id].OrderBy(qr => qr.CreatedOn).FirstOrDefault(s => s.dfeta_EYTSDate is not null), referenceDataCache),
})
.OrderBy(c => c.Trn)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public record GetPersonResult
public required Option<IReadOnlyCollection<Alert>> Alerts { get; init; }
public required Option<IReadOnlyCollection<NameInfo>> PreviousNames { get; init; }
public required Option<bool> AllowIdSignInWithProhibitions { get; init; }
public required string QtlsStatus { get; set; }
}

public record GetPersonResultInduction : InductionInfo
Expand Down Expand Up @@ -193,7 +194,9 @@ public async Task<ApiResult<GetPersonResult>> HandleAsync(GetPersonCommand comma
Contact.Fields.dfeta_EYTSDate,
Contact.Fields.EMailAddress1,
Contact.Fields.dfeta_AllowIDSignInWithProhibitions,
Contact.Fields.dfeta_InductionStatus)));
Contact.Fields.dfeta_InductionStatus,
Contact.Fields.dfeta_QtlsDateHasBeenSet,
Contact.Fields.dfeta_qtlsdate)));

if (contactDetail is null)
{
Expand Down Expand Up @@ -386,6 +389,8 @@ async Task<T> WithTrsDbLockAsync<T>(Func<Task<T>> action)
induction = Option.Some(mappedInduction.Induction);
}

var qtlsStatus = MapQtlsStatus(contact.dfeta_qtlsdate, contact.dfeta_QtlsDateHasBeenSet);

return new GetPersonResult()
{
Trn = command.Trn,
Expand All @@ -396,7 +401,8 @@ async Task<T> WithTrsDbLockAsync<T>(Func<Task<T>> action)
NationalInsuranceNumber = contact.dfeta_NINumber,
PendingNameChange = command.Include.HasFlag(GetPersonCommandIncludes.PendingDetailChanges) ? Option.Some((await getPendingDetailChangesTask!).PendingNameRequest) : default,
PendingDateOfBirthChange = command.Include.HasFlag(GetPersonCommandIncludes.PendingDetailChanges) ? Option.Some((await getPendingDetailChangesTask!).PendingDateOfBirthRequest) : default,
Qts = await QtsInfo.CreateAsync(qts, referenceDataCache),
Qts = await QtsInfo.CreateAsync(qts, referenceDataCache, contact.dfeta_qtlsdate, contact.dfeta_QtlsDateHasBeenSet),
QtlsStatus = qtlsStatus,
Eyts = await EytsInfo.CreateAsync(eyts, referenceDataCache),
EmailAddress = contact.EMailAddress1,
Induction = induction,
Expand Down Expand Up @@ -462,6 +468,18 @@ async Task<T> WithTrsDbLockAsync<T>(Func<Task<T>> action)
};
}

private static string MapQtlsStatus(DateTime? qtlsDate, bool? qtlsDateHasBeenSet)
{
return (qtlsDate, qtlsDateHasBeenSet) switch
{
(not null, _) => "Active",
(null, true) => "Expired",
(null, false) => "None",
(_, _) => "None",
};
}


private static (GetPersonResultDqtInduction? DqtInduction, GetPersonResultInduction Induction) MapInduction(
dfeta_induction? induction,
IEnumerable<dfeta_inductionperiod>? inductionPeriods,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace TeachingRecordSystem.Api.V3.VNext.Responses;
public partial record GetPersonResponse
{
public required Option<GetPersonResponseInduction> Induction { get; init; }
public required string QtlsStatus { get; set; }
}

[AutoMap(typeof(GetPersonResultInduction))]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public async Task Get_WithNonNullDqtInductionStatus_ReturnsExpectedInduction()
responseInduction);
}


[Fact]
public async Task Get_WithNullDqtInductionStatus_ReturnsNoneInductionStatus()
{
Expand All @@ -66,4 +67,69 @@ public async Task Get_WithNullDqtInductionStatus_ReturnsNoneInductionStatus()
},
responseInduction);
}

[Fact]
public async Task Get_WithQtlsDate_ReturnsActiveQtlsStatus()
{
// Arrange
var qtlsDate = new DateOnly(2020, 01, 01);
var person = await TestData.CreatePersonAsync(p => p
.WithTrn()
.WithQtlsDate(qtlsDate));

// Arrange
var request = new HttpRequestMessage(HttpMethod.Get, "/v3/person");

// Act
var response = await GetHttpClientWithIdentityAccessToken(person.Trn!).SendAsync(request);

// Assert
var jsonResponse = await AssertEx.JsonResponseAsync(response);
var qtlsStatus = jsonResponse.RootElement.GetProperty("qtlsStatus").GetString();
Assert.Equal("Active", qtlsStatus!);
}

[Fact]
public async Task Get_WithoutQtlsDate_ReturnsNoneQtlsStatus()
{
// Arrange
var person = await TestData.CreatePersonAsync(p => p
.WithTrn());

// Arrange
var request = new HttpRequestMessage(HttpMethod.Get, "/v3/person");

// Act
var response = await GetHttpClientWithIdentityAccessToken(person.Trn!).SendAsync(request);

// Assert
var jsonResponse = await AssertEx.JsonResponseAsync(response);
var qtlsStatus = jsonResponse.RootElement.GetProperty("qtlsStatus").GetString();
Assert.Equal("None", qtlsStatus!);
}

[Fact]
public async Task Get_WithExpiredQtlsDate_ReturnsExpiredQtlsStatus()
{
// Arrange
var qtlsDate = new DateOnly(2020, 01, 01);
var person = await TestData.CreatePersonAsync(p => p
.WithTrn()
.WithQtlsDate(qtlsDate));

var entity = new Microsoft.Xrm.Sdk.Entity() { Id = person.PersonId, LogicalName = Contact.EntityLogicalName };
entity[Contact.Fields.dfeta_qtlsdate] = null;
await TestData.OrganizationService.UpdateAsync(entity);

// Arrange
var request = new HttpRequestMessage(HttpMethod.Get, "/v3/person");

// Act
var response = await GetHttpClientWithIdentityAccessToken(person.Trn!).SendAsync(request);

// Assert
var jsonResponse = await AssertEx.JsonResponseAsync(response);
var qtlsStatus = jsonResponse.RootElement.GetProperty("qtlsStatus").GetString();
Assert.Equal("Expired", qtlsStatus!);
}
}

0 comments on commit 370d380

Please sign in to comment.