Skip to content

Commit

Permalink
CDMS-200 changes decision status to an enum
Browse files Browse the repository at this point in the history
  • Loading branch information
craigedmunds committed Jan 3, 2025
1 parent 2c99c8c commit 25abc2d
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 15 deletions.
9 changes: 5 additions & 4 deletions Btms.Analytics/MovementsAggregationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ public Task<SummarisedDataset<SingleSeriesDataset, StringBucketDimensionResult>>
.SelectMany(d => d.Decision.Context.Checks.Select(c => new { d.Decision, d.Movement, Check = c}))
.GroupBy(d => new
{
DecisionStatus = d.Decision.Context.DecisionStatus!.Value,
d.Decision.Context.DecisionStatus,
d.Check.CheckCode,
d.Check.AlvsDecisionCode,
d.Check.BtmsDecisionCode
Expand All @@ -301,12 +301,13 @@ public Task<SummarisedDataset<SingleSeriesDataset, StringBucketDimensionResult>>
.Execute(logger);

logger.LogDebug("Aggregated Data {Result}", mongoQuery.ToJsonString());


var enumLookup = new JsonStringEnumConverterEx<DecisionStatusEnum>();

// Works
var summary = new SingleSeriesDataset() {
Values = mongoQuery
.GroupBy(q => q.Key.DecisionStatus.ToString())
.GroupBy(q => enumLookup.GetValue(q.Key.DecisionStatus))
.ToDictionary(
g => g.Key,
g => g.Sum(k => k.Count)
Expand All @@ -320,7 +321,7 @@ public Task<SummarisedDataset<SingleSeriesDataset, StringBucketDimensionResult>>
{
Fields = new Dictionary<string, string>()
{
{ "Classification", a.Key.DecisionStatus.ToString() },
{ "Classification", enumLookup.GetValue(a.Key.DecisionStatus) },
{ "CheckCode", a.Key.CheckCode! },
{ "AlvsDecisionCode", a.Key.AlvsDecisionCode! },
{ "BtmsDecisionCode", a.Key.BtmsDecisionCode! }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Btms.Model;
using Btms.Model.Cds;
using FluentAssertions;
using TestDataGenerator.Scenarios;
using TestGenerator.IntegrationTesting.Backend;
Expand Down Expand Up @@ -36,7 +37,7 @@ public void ShouldHaveDecisionStatus()
.GetResourceObjects<Movement>()
.Single();

movement.AlvsDecisionStatus.DecisionStatus.Should().BeNull();
movement.AlvsDecisionStatus.DecisionStatus.Should().Be(DecisionStatusEnum.InvestigationNeeded);

Check failure on line 40 in Btms.Backend.IntegrationTests/DecisionTests/NoMatchNoAlvsDecisionTests.cs

View workflow job for this annotation

GitHub Actions / Run Pull Request Checks

Btms.Backend.IntegrationTests.DecisionTests.NoMatchNoAlvsDecisionTests.ShouldHaveDecisionStatus

Expected movement.AlvsDecisionStatus.DecisionStatus to be DecisionStatusEnum.InvestigationNeeded {value: 1}, but found DecisionStatusEnum.NoAlvsDecisions {value: 0}.
}

[Fact]
Expand Down
4 changes: 3 additions & 1 deletion Btms.Backend.IntegrationTests/DecisionTests/NoMatchTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Btms.Backend.IntegrationTests.Helpers;
using Btms.Model;
using Btms.Model.Cds;
using FluentAssertions;
using Humanizer;
using TestDataGenerator.Scenarios;
using TestGenerator.IntegrationTesting.Backend;
using TestGenerator.IntegrationTesting.Backend.Fixtures;
Expand Down Expand Up @@ -48,7 +50,7 @@ public void ShouldHaveDecisionStatus()
.GetResourceObjects<Movement>()
.Single();

movement.AlvsDecisionStatus.DecisionStatus.Should().BeNull();
movement.AlvsDecisionStatus.DecisionStatus.Should().Be(DecisionStatusEnum.InvestigationNeeded);
}

[Fact]
Expand Down
39 changes: 30 additions & 9 deletions Btms.Model/Cds/AlvsDecision.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using JsonApiDotNetCore.Resources.Annotations;
using System.Text.Json.Serialization;
using System.Dynamic;
using System.Runtime.Serialization;
using Btms.Model.Auditing;
using Btms.Model.Ipaffs;
using MongoDB.Bson.Serialization.Attributes;
Expand Down Expand Up @@ -126,14 +127,32 @@ public static MovementStatus Default()

}

[JsonConverter(typeof(JsonStringEnumConverterEx<DecisionStatusEnum>))]
public enum DecisionStatusEnum {
InvestigationNeeded, // = "Investigation Needed";
BtmsDecisionNotPresent, // = "Btms Decision Not Present";
BtmsMadeSameDecisionAsAlvs, // = "Btms Made Same Decision As Alvs";
AlvsClearanceRequestVersion1NotPresent, //"Alvs Clearance Request Version 1 Not Present"
AlvsClearanceRequestVersionsNotComplete, //"Alvs Clearance Request Versions Not Complete"
AlvsDecisionVersion1NotPresent, //"Alvs Decision Version 1 Not Present"
AlvsDecisionVersionsNotComplete //"Alvs Decision Versions Not Complete"

[EnumMember(Value = "No Alvs Decisions")]
NoAlvsDecisions,

[EnumMember(Value = "Investigation Needed")]
InvestigationNeeded,

[EnumMember(Value = "Btms Decision Not Present")]
BtmsDecisionNotPresent,

[EnumMember(Value = "Btms Made Same Decision As Alvs")]
BtmsMadeSameDecisionAsAlvs,

[EnumMember(Value = "Alvs Clearance Request Version 1 Not Present")]
AlvsClearanceRequestVersion1NotPresent,

[EnumMember(Value = "Alvs Clearance Request Versions Not Complete")]
AlvsClearanceRequestVersionsNotComplete,

[EnumMember(Value = "Alvs Decision Version 1 Not Present")]
AlvsDecisionVersion1NotPresent,

[EnumMember(Value = "Alvs Decision Versions Not Complete")]
AlvsDecisionVersionsNotComplete
}

public partial class DecisionContext : IAuditContext //
Expand Down Expand Up @@ -166,7 +185,8 @@ public partial class DecisionContext : IAuditContext //

[Attr]
[System.ComponentModel.Description("")]
public DecisionStatusEnum? DecisionStatus { get; set; }
[MongoDB.Bson.Serialization.Attributes.BsonRepresentation(MongoDB.Bson.BsonType.String)]
public DecisionStatusEnum DecisionStatus { get; set; }

[Attr]
[System.ComponentModel.Description("")]
Expand All @@ -189,7 +209,8 @@ public partial class AlvsDecisionStatus //

[Attr]
[System.ComponentModel.Description("")]
public DecisionStatusEnum? DecisionStatus { get; set; } = default;
[MongoDB.Bson.Serialization.Attributes.BsonRepresentation(MongoDB.Bson.BsonType.String)]
public DecisionStatusEnum DecisionStatus { get; set; } = DecisionStatusEnum.NoAlvsDecisions;

[Attr]
[System.ComponentModel.Description("")]
Expand Down
71 changes: 71 additions & 0 deletions Btms.Model/JsonStringEnumConverterEx.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System.Runtime.Serialization;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Btms.Model;

public class JsonStringEnumConverterEx<TEnum> : JsonConverter<TEnum> where TEnum : struct, System.Enum
{

private readonly Dictionary<TEnum, string> _enumToString = new();
private readonly Dictionary<string, TEnum> _stringToEnum = new();
private readonly Dictionary<int, TEnum> _numberToEnum = new();

public JsonStringEnumConverterEx()
{
var type = typeof(TEnum);

foreach (var value in Enum.GetValues<TEnum>())
{
var enumMember = type.GetMember(value.ToString())[0];
var attr = enumMember.GetCustomAttributes(typeof(EnumMemberAttribute), false)
.Cast<EnumMemberAttribute>()
.FirstOrDefault();

_stringToEnum.Add(value.ToString(), value);
var num = Convert.ToInt32(type.GetField("value__")!
.GetValue(value));
if (attr?.Value != null)
{
_enumToString.Add(value, attr.Value);
_stringToEnum.Add(attr.Value, value);
_numberToEnum.Add(num, value);
}
else
{
_enumToString.Add(value, value.ToString());
}
}
}

public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var type = reader.TokenType;
if (type == JsonTokenType.String)
{
var stringValue = reader.GetString()!;
if (_stringToEnum.TryGetValue(stringValue, out var enumValue))
{
return enumValue;
}
}
else if (type == JsonTokenType.Number)
{
var numValue = reader.GetInt32();
_numberToEnum.TryGetValue(numValue, out var enumValue);
return enumValue;
}

return default;
}

public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
{
writer.WriteStringValue(_enumToString[value]);
}

public string GetValue(TEnum value)
{
return _enumToString[value];
}
}

0 comments on commit 25abc2d

Please sign in to comment.